https://blog.csdn.net/cc_0101/article/details/80664561
以上链接是个扩展应用,下是我触发器使用总结
new和old的使用情况
下面具体说说old和new的使用情况。在对new赋值的时候只能在触发器before中只用,在after中是不能使用的,比如(以下是正确的)。
CREATE TRIGGER updateprice
BEFORE insert
ON consumeinfo
FOR EACH ROW
BEGIN
set new.金额=0;
END;
这个说明对当前插入数据进行更新的时候使用before先更新完,然后才插入到数据库中的,
在after的触发器中,new的赋值已经结束了,只能读取内容。 如果使用after不能使用new赋值,只能取值,否则会出错误,比如
CREATE TRIGGER updateprice
AFTER insert
ON consumeinfo
FOR EACH ROW
BEGIN
set new.金额=0;
END;
报错如下:
[Err] 1362 - Updating of NEW row is not allowed in after trigger
应用场景:在更新一张表后,进行修改另一张表,就是一旦数据库表A中某些字段更改,那么表B与表B保持一致:
create or replace trigger update after update on 数据库A for each row
declare
new_a varchar2(32):=:new.a;
new_b varchar2(32):=:new.b;
new_c varchar2(256):=:new.b;
old_a varchar2(32):=:old.a;
old_b varchar2(32):=:old.b;
old_c varchar2(256):=:old.b;
v_update_exec varchar2(4):='N';
begin
if new_a <>old_a then
v_update_exec:='Y';
end if;
if new_b <>old_b then
v_update_exec:='Y';
end if;
if new_c <>old_c then
v_update_exec:='Y';
end if;
if v_update_exec='Y' then
update
数据库B
set
a= new_a ,
b= new_b ,
b= new_c
where
id= :new.id;
end if;
end;
<>是不等于的意思
create or replace trigger userinfo_trg
after insert or update or delete on userinfo
for each row
declare
v_num varchar(10);
begin
if :old.uname <> :new.uname or :old.ucode is null then
--只有当用户名称修改或者新增时,才会执行触发器
select count(*) into v_num from userLogInfo us;
if v_num <> 0 then--如果没有这个记录,则不删除
delete from userLogInfo us where us.ucode = :new.ucode;
end if;
insert into userLogInfo
(ucode, Newnname, Oldnname, Newphone)
values
(:new.ucode, :new.uname, :old.uname, :new.uphonne);
end if;
end;