资讯详情

Pgsql以及Kingbasees创建触发器

文章目录

  • 什么是触发器
  • PGSQL创建触发器的方式Oracle有些不同(没有找到更快的方法查阅文档);
    • Oracle创建触发器的方法:
    • PGSQL创建触发器的方法:
    • 例子
  • KingbaseES创建触发器的方法


什么是触发器?

触发器可以与表绑定,当表制作时Delete、Update、Insert当这些操作更改表时,触发触发器中的逻辑,通常用于日志输出。

PGSQL创建触发器的方式Oracle有些不同(没有找到更快的方法查阅文档);

Oracle创建触发器的方法:

CREATE OR REPLACE TRIGGER meta_log_insert_trigger  AFTER INSERT OR UPDATE OR DELETE ON ly_ysj_yw_bxx --这里声明了触发器绑定的表  for each row DECLARE     bgzt varchar2(24); BEGIN     -- 这里判断触发类型(Delete、Update、Insert)    IF UPDATING THEN       bgzt := 'U';    ELSIF DELETING THEN      bgzt := 'D';    ELSIF INSERTING THEN      bgzt := 'I';    END IF;      -- 触发器逻辑    IF  DELETING THEN        insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt)      values(:old.bbh,:old.kbh,:old.wlblx,:old.bywmc,:old.bms,:old.jls      ,:old.bzxx,:old.sqr,:old.bsqr,:old.sfyxzsq,:old.qxlx,:old.ywblx,:old.sfgl,:old.glyy ,:old.czr,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),:old.ssbkjmc,:old.bzt,:old.ysbm,:old.ysbzwm,:old.sfyyfx,:old.shr,:old.shsj,bgzt); ELSE insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt) values(:new.bbh,:new.kbh,:new.wlblx,:new.bywmc,:new.bms,:new.jls ,:new.bzxx,:new.sqr,:new.bsqr,:new.sfyxzsq,:new.qxlx,:new.ywblx,:new.sfgl,:new.glyy ,:new.czr,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),:new.ssbkjmc,:new.bzt,:new.ysbm,:new.ysbzwm,:new.sfyyfx,:new.shr,:new.shsj,bgzt); END IF; END; 

PGSQL创建触发器的方式:

  1. 定义一个返回trigger类型的方法,在后续定义触发器时,把该方法与表进行绑定,触发器就相当于中介的作用,在表发生内容上的修改时通知该方法并执行
CREATE or replace function meta_log_insert_trigger()
 returns trigger -- 改方法返回的是触发器
as $meta_log_insert_trigger$

DECLARE
    bgzt varchar(24);
BEGIN
    -- 这里判断触发的类型(Delete、Update、Insert)
    IF (tg_op = 'UPDATE') THEN
        bgzt := 'U';
    ELSIF (tg_op = 'DELETE') THEN
        bgzt := 'D';
    ELSIF (tg_op = 'INSERT') THEN
        bgzt := 'I';
    END IF;
    
    -- 触发器逻辑
   IF  (tg_op = 'DELETE') THEN
       insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt)
     values(old.bbh,old.kbh,old.wlblx,old.bywmc,old.bms,old.jls
     ,old.bzxx,old.sqr,old.bsqr,old.sfyxzsq,old.qxlx,old.ywblx,old.sfgl,old.glyy
     ,old.czr,to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss'),old.ssbkjmc,old.bzt,old.ysbm,old.ysbzwm,old.sfyyfx,old.shr,old.shsj,bgzt);

   ELSE

    insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt)
     values(new.bbh,new.kbh,new.wlblx,new.bywmc,new.bms,new.jls
     ,new.bzxx,new.sqr,new.bsqr,new.sfyxzsq,new.qxlx,new.ywblx,new.sfgl,new.glyy
     ,new.czr,to_char(current_timestamp,'yyyy-mm-dd hh24:mi:ss'),new.ssbkjmc,new.bzt,new.ysbm,new.ysbzwm,new.sfyyfx,new.shr,new.shsj,bgzt);

    END IF;
    return null;
END;$meta_log_insert_trigger$ language plpgsql;
  1. 创建触发器并进行绑定

–定义触发器名称

create trigger meta_log_insert_trigger
--定义触发器在什么类型时触发(insert or update or delete )、声明绑定的表(ly_ysj_yw_bxx)
after insert or update or delete on ly_ysj_yw_bxx 
-- 声明绑定的方法,即上面创建的方法meta_log_insert_trigger()
for each row execute procedure meta_log_insert_trigger();
  1. 对触发器进行删除(需要先删除触发器才能对返回触发器的方法删除,具体如下)
drop trigger meta_log_insert_trigger on ly_ysj.ly_ysj_yw_bxx;
drop function meta_log_insert_trigger()

例子

简单例子:

  1. 建表test1
create table test1(
    id integer,
    name varchar(20)
);
  1. 创建返回触发器的方法
create or replace function test1_trigger()
returns trigger as
$test1_trigger$
declare
leixing varchar(24);
begin
    -- 这里判断触发的类型(Delete、Update、Insert)
    IF (tg_op = 'UPDATE') THEN
        leixing := '修改';
    ELSIF (tg_op = 'DELETE') THEN
        leixing := '删除';
    ELSIF (tg_op = 'INSERT') THEN
        leixing := '新增';
    END IF;

    if (tg_op = 'UPDATE') then
        raise notice '触发的类型是 %,修改前的id:%, name:%,修改后的id:%, name:%',leixing,old.id,old.name,new.id,new.name;
    elsif  (tg_op = 'DELETE') then
        raise notice '触发的类型是 %,删除的行,id:% , name:%',leixing,old.id,old.name;
    else
        raise notice '触发的类型是 %,新增的行,id:% , name:%',leixing,new.id,new.name;

    end if;

end;
$test1_trigger$language plpgsql;
  1. 创建触发器(我对这个触发器的理解,把他看做一个中介,用以对表监控,并与方法进行绑定)
create trigger test1trigger
after insert or update or delete on test1
for each row execute procedure test1_trigger();
  1. 加入数据时:
insert into test1(id,name) values (1,'小明');

发现会报错=》ERROR: control reached end of trigger procedure without RETURN 在方法内加入return null即可解决(具体原因未知)

加入后执行:

[2021-09-26 15:46:35] [00000] 新增了数据 {1 ,小明}
[2021-09-26 15:46:35] [00000] 触发的类型是 新增,新增的行,id:1 , name:小明
  1. 修改数据 update test1 set id=2,name=‘小红’ where id=1; 运行结果:
[2021-09-26 15:47:14] [00000] 修改前数据 {1 ,小明}
[2021-09-26 15:47:14] [00000] 修改后数据 {2 ,小红}
[2021-09-26 15:47:14] [00000] 触发的类型是 修改,修改前的id:1, name:小明,修改后的id:2, name:小红

6.删除数据: delete from test1 where id=2; 运行结果:

[2021-09-26 15:47:49] [00000] 删除了数据 {2 ,小红}
[2021-09-26 15:47:49] [00000] 触发的类型是 删除,删除的行,id:2 , name:小红

KingbaseES创建触发器的方式

具体与PGSQL的方式一样,只不过是写法上的差异,具体如下

  1. 创建返回trigger触发器的方法
CREATE or replace function meta_log_insert_trigger()
 returns trigger
as ' DECLARE bgzt varchar(24); BEGIN IF (tg_op = ''UPDATE'') THEN bgzt := ''U''; ELSIF (tg_op = ''DELETE'') THEN bgzt := ''D''; ELSIF (tg_op = ''INSERT'') THEN bgzt := ''I''; END IF; IF (tg_op = ''DELETE'') THEN insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt) values(old.bbh,old.kbh,old.wlblx,old.bywmc,old.bms,old.jls ,old.bzxx,old.sqr,old.bsqr,old.sfyxzsq,old.qxlx,old.ywblx,old.sfgl,old.glyy ,old.czr,to_char(current_timestamp,''yyyy-mm-dd hh24:mi:ss''),old.ssbkjmc,old.bzt,old.ysbm,old.ysbzwm,old.sfyyfx,old.shr,old.shsj,bgzt); ELSE insert into ly_ysj_yw_bxx_log(bbh,kbh,wlblx,bywmc,bms,jls,bzxx,sqr,bsqr,sfyxzsq,qxlx,ywblx,sfgl,glyy,czr,czsj,ssbkjmc,bzt,ysbm,ysbzwm,sfyyfx,shr,shsj,bgzt) values(new.bbh,new.kbh,new.wlblx,new.bywmc,new.bms,new.jls ,new.bzxx,new.sqr,new.bsqr,new.sfyxzsq,new.qxlx,new.ywblx,new.sfgl,new.glyy ,new.czr,to_char(current_timestamp,''yyyy-mm-dd hh24:mi:ss''),new.ssbkjmc,new.bzt,new.ysbm,new.ysbzwm,new.sfyyfx,new.shr,new.shsj,bgzt); END IF; END;'
language plsql;
  1. 创建触发器把表与方法进行绑定
create trigger meta_log_insert_trigger
after insert or update or delete on ly_ysj_yw_bxx
for each row execute procedure meta_log_insert_trigger();

标签: kbh智能压力变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司