在使用触发器前先理解两个概念:new和:old, :new代表执行更新操作之后的新表,:old代表执行更新操作之前的旧表。通过这两张表的使用,可以访问到触发器执行前后表数据的变化。
insert操作只有:new,delete操作只有:old,update操作二者皆有。
:new 和 :old只用于行级触发器。
–:new表,将插入的数据先放入到:new表中,确认后放到要更新的表。
–:old表,将不要的数据先放入到:old表中,确认不要了再清除:old表。
–注意::new表和:old表中至始至终就只有一条数据,而列的话,触发器的表有多少个列,:new表和:old表就有多少个列。
create or replace trigger user
after delete or insert or update
on SYS_MEMBERS --在SYS_MEMBERS表中
for each row --行级模式(屏蔽该条语句为语句级触发器)
begin
case
when deleting then --删除时
if :old.LOGIN_USER='C01' then --如果:old表中存在C01,就提示不能删
dbms_output.put_line('该用户不能删');
raise_application_error(-20010,'该用户不能删!!!');
end if;
when updating then --修改时
if :old.LOGIN_USER='C01' then --如果:old表中存在C01,就提示不能修改
raise_application_error(-20011,'该用户不能修改!!!');
end if;
when inserting then --插入时
if :new.LOGIN_USER='C01' then --如果:new表中存在C01,就提示不能插入
dbms_output.put_line('C01用户已经存在');
raise_application_error(-20012,'C01用户不能添加!!!');
elsif :new.LOGIN_USER='a01' then --如果:new表中存在a01,就提示不能插入
dbms_output.put_line('a01用户已经存在');
raise_application_error(-20012,'a01用户不能添加!!!');
elsif :new.LOGIN_USER='a1001' then --如果:new表中存在a1001,就提示不能插入
dbms_output.put_line('a1001用户已经存在');
raise_application_error(-20012,'a1001用户不能添加!!!');
else
dbms_output.put_line('添加成功!!!');
end if;
end case;
end;
下面是测试代码
update SYS_MEMBERS set REGISTER_TIME = '2019-11-28 22:40:40' where LOGIN_USER = 'C01';
insert into SYS_MEMBERS values (10086,'C01','123','123',1,'2019-12-25 10:30:00','a1001','0,a1001',0,'张三',0,'',2,1,'666','455','111',0,0);
delete from SYS_MEMBERS where LOGIN_USER='C01';