人大金仓数据库KingbaseES 触发器介绍之行级触发器

金仓数据库KingbaseES 触发器介绍之行级触发器

关键字:

KingbaseES、触发器、人大金仓、KingbaseES

触发器介绍

当我们对表进行数据操作时,需要同步对表执行相应操作,正常情况下,我们使用sql语句进行更新,需要执行多条SQL语句。如果采用触发器的形式,当执行相应操作时,就会触发执行触发器定义操作。下面对KingbaseES触发器使用进行介绍。

KingbaseES的触发器在触发时间上可以分为:前置触发器(在语句执行前触发)、instead of触发器、后置触发器和延迟触发器。触发器在执行粒度上可以分为:语句触发器和行级触发器。

触发器的使用

KingbaseES中,触发器创建语法可以分为两类:在创建触发器前定义执行函数、在创建触发器时定义执行函数。具体语法如下:

create_trigger ::=

CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]

TRIGGER plsql_trigger_source

plsql_trigger_source ::=

[ schema. ]trigger_name

{ simple_dml_trigger

| instead_of_dml_trigger

}

simple_dml_trigger ::=

{ BEFORE | AFTER } dml_event_clause [ referencing_clause ] [ FOR EACH ROW ]

[ WHEN ( condition ) ] trigger_body

instead_of_dml_trigger ::=

INSTEAD OF { DELETE | INSERT | UPDATE } [ OR { DELETE | INSERT | UPDATE } ]...

ON [ schema. ] noneditioning_view

[ referencing_clause ] [ FOR EACH ROW ]

trigger_body

dml_event_clause ::=

{ DELETE | INSERT | UPDATE [ OF column [, column ]... ] }

[ OR { DELETE | INSERT | UPDATE [ OF column [, column]... ] }...

ON [ schema.] { table | view }

trigger_body ::=

{ plsql_block | CALL routine_clause }

routine_clause ::=

[ schema. ] [ type. ]

{ procedure | method }

( )

  • 前置触发器的使用:触发器将在语句执行前执行
  • 创建前置触发器

--创建表

create table base1(id int, name text);

CREATE OR REPLACE FUNCTION trigger_before () RETURNS TRIGGER AS

$$

BEGIN

New.id := new.id +1;

return NEW;

END;

$$ LANGUAGE plpgsql;

create trigger base1_before before insert on base1 for EACH ROW execute procedure trigger_before ();

insert INTO base1 values(1,'trigger');

--查询插入结果,发现插入列数据被加1

SELECT * from base1;

  • instead of 触发器的使用:执行后将不在执行相关操作。

--创建第二个表

create table base2(id int, birthday text);

--INSTEAD OF 触发器

CREATE OR REPLACE FUNCTION trigger_instead () RETURNS TRIGGER AS

$$

BEGIN

Insert into base2 VALUES (NEW.ID,new.name);

return NULL;

END;

$$ LANGUAGE plpgsql;

CREATE VIEW base1_view as SELECT * from base1;

create trigger base1_instead instead of insert on base1_view for EACH ROW execute procedure trigger_instead ();

INSERT into base1_view values(1,'instead_of_trigger');

--base1并没有插入相关数据

SELECT * FROM base1;

--数据插入到了base2中

SELECT * FROM base2;

  • 后置触发:将在操作执行后进行触发

Drop trigger base1_before;

--after 触发器

CREATE OR REPLACE FUNCTION trigger_after () RETURNS TRIGGER AS

$$

BEGIN

UPDATE base1 set id =3;

return NULL;

END;

$$ LANGUAGE plpgsql;

create trigger base1_after after insert on base1 for EACH ROW execute procedure trigger_after ();

insert INTO base1 values(1,'trigger');

--后置触发UPDATE修改了插入结果

SELECT * FROM base1;

  • 延迟触发器:将在事务提交时触发

Drop trigger base1_after;

--创建延迟 触发器

CREATE OR REPLACE FUNCTION trigger_DEFERRED () RETURNS TRIGGER AS

$$

BEGIN

UPDATE base1 set id =3;

return NULL;

END;

$$ LANGUAGE plpgsql;

create CONSTRAINT trigger base1_DEFERRED after insert or update or DELETE on base1 INITIALLY DEFERRED for EACH ROW execute procedure trigger_DEFERRED ();

--清除原有数据

DELETE from base1;

DELETE from base2;

--在事务中插入数据

Begin

INSERT INTO base1 values(1,'TRIGGER_ori');

SELECT * from base1;

--事务块结束后再进行查询,可以获取触发器执行结果

End;

SELECT * from base2;

总结

本文主要介绍了行级触发器的创建和使用。前置的行级触发器将在执行操作前触发,instead of触发器将在替换原有操作,后置触发器将在执行操作后触发,延迟触发器将在事务提交阶段进行触发。

参考资料

《KingbaseES产品手册》

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值