触发器

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; 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值