文章目录
- 什么是触发器?
- 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创建触发器的方式:
- 定义一个返回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;
- 创建触发器并进行绑定
–定义触发器名称
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();
- 对触发器进行删除(需要先删除触发器才能对返回触发器的方法删除,具体如下)
drop trigger meta_log_insert_trigger on ly_ysj.ly_ysj_yw_bxx;
drop function meta_log_insert_trigger()
例子
简单例子:
- 建表test1
create table test1(
id integer,
name varchar(20)
);
- 创建返回触发器的方法
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;
- 创建触发器(我对这个触发器的理解,把他看做一个中介,用以对表监控,并与方法进行绑定)
create trigger test1trigger
after insert or update or delete on test1
for each row execute procedure test1_trigger();
- 加入数据时:
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:小明
- 修改数据 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的方式一样,只不过是写法上的差异,具体如下
- 创建返回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;
- 创建触发器把表与方法进行绑定
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();