暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 触发器 示例

墨天轮 2019-10-12
595

示例

此示例将演示使用触发器的整个流程,包括创建和删除触发器。

示例语句

--删除已经存在的表T_TRIG。 DROP TABLE IF EXISTS T_TRIG;
--删除已经存在的表T_TRIG_LOG。 DROP TABLE IF EXISTS T_TRIG_LOG;
--删除已经存在的序列TRIG_LOG_SEQ。 DROP SEQUENCE IF EXISTS TRIG_LOG_SEQ;
--删除已经存在的触发器TRIG_AFTER_INSERT。 DROP TRIGGER IF EXISTS TRIG_AFTER_INSERT;
--删除已经存在的触发器TRIG_BEFORE_INSERT。 DROP TRIGGER IF EXISTS TRIG_BEFORE_INSERT;
--创建表T_TRIG。 CREATE TABLE T_TRIG (ID INT, CREATE_DATE TIMESTAMP);
--创建表T_TRIG_LOG。 CREATE TABLE T_TRIG_LOG (LOG_SEQ INT,LOG_DESC VARCHAR(30), CREATE_DATE TIMESTAMP);
--创建序列TRIG_LOG_SEQ。 CREATE SEQUENCE TRIG_LOG_SEQ START WITH 1 INCREMENT BY 1;

使用行触发器时,有如下校验规则:

  • TRIG_BEFORE_EACH_ROW类型触发器,规则如表1。
  • TRIG_AFTER_EACH_ROW类型触发器,规则如表2。
表1 TRIG_BEFORE_EACH_ROW类型触发器规则

外层SQL类型

触发器中的SQL

校验结果

UPDATE/DELETE

select/insert/update/delete/merge和外层SQL相同的表

ERR_TAB_MUTATING

INSERT

select/insert/update/delete/merge任何表

OK

MERGE

SELECT任何表

OK

MERGE

insert/update/delete/merge和外层SQL相同的表

ERR_TAB_MUTATING

表2 TRIG_AFTER_EACH_ROW类型触发器规则

外层SQL类型

触发器中的SQL

校验结果

UPDATE/DELETE

select/insert/update/delete/merge和外层SQL相同的表

ERR_TAB_MUTATING

INSERT

select/insert/update/delete/merge和外层SQL相同的表

ERR_TAB_MUTATING

MERGE

SELECT任何表

OK

MERGE

insert/update/delete/merge和外层SQL相同的表

ERR_TAB_MUTATING

--创建表1。 CREATE TABLE T_TRIG_1 (F_INT1 INT, F_INT2 INT, F_CHAR1 CHAR(16), F_DATE DATE); Succeed.
--往表1中写入一条数据。 INSERT INTO T_TRIG_1 VALUES(1,2,'A','2017-12-11 14:08:00'); 1 rows affected.
--创建表1的行触发器,每次往表1中insert一条语句时就会触发,触发器中存在更新表1的语句。 CREATE OR REPLACE TRIGGER TEST_TRIG AFTER INSERT ON T_TRIG_1 FOR EACH ROW BEGIN UPDATE T_TRIG_1 SET F_INT1 = 1; END; / Succeed.
--往表1中插入一条数据时,因为触发器中会更新相同的表,导致报错。 INSERT INTO T_TRIG_1 VALUES(1,2,'A','2017-12-11 14:08:00'); GS-00932, PL/SQL(SYS.TEST_TRIG) terminated with execute errors [4:3] GS-00927, The trigger or user-defined function used by a SQL statement which is adjusting a table %s.%s did not find the table..

创建触发器时,最后的“/”符号用于标示触发器定义语句的结束,不能省略,且必须单独成行。

--创建一个触发器,在往T_TRIG表中INSERT一条记录之后,往T_TRIG_LOG中写一条描述为"after insert"的记录。 CREATE OR REPLACE TRIGGER TRIG_AFTER_INSERT AFTER INSERT ON T_TRIG BEGIN INSERT INTO T_TRIG_LOG VALUES(TRIG_LOG_SEQ.NEXTVAL,'after insert',systimestamp); END; /
--创建一个触发器,在往T_TRIG表中INSERT一条记录之前,往T_TRIG_LOG中写一条描述为"before insert"记录。 CREATE OR REPLACE TRIGGER TRIG_BEFORE_INSERT BEFORE INSERT ON T_TRIG BEGIN INSERT INTO T_TRIG_LOG VALUES(TRIG_LOG_SEQ.NEXTVAL,'before insert',systimestamp); END; /
--往T_TRIG表中INSERT一条记录。 INSERT INTO T_TRIG VALUES (1,systimestamp);
--查询表T_TRIG的数据。 SELECT * FROM T_TRIG; ID CREATE_DATE ------------ -------------------------------- 1 2018-09-11 15:59:36.970759 1 rows fetched.
--查询表T_TRIG_LOG的数据。 SELECT * FROM T_TRIG_LOG; LOG_SEQ LOG_DESC CREATE_DATE ------------ ------------------------------ -------------------------------- 1 before insert 2018-09-11 15:59:36.967120 2 after insert 2018-09-11 15:59:36.974199 2 rows fetched.
--删除触发器。 DROP TRIGGER IF EXISTS T_TRIG;
「喜欢文章,快来给作者赞赏墨值吧」
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论