创建触发器
功能描述
创建一个新的触发器。
注意事项
- “OF column_name”只能在行触发器中使用,且该列数据类型不能为LOB。
- 触发器内部不能出现DDL和DCL操作,普通用户不可以创建系统用户对象。
- 触发事件为数据插入(BEFORE | AFTER INSERT)时,行触发器内部不能出现向被触发表中插入数据的操作;触发事件为数据更改(BEFORE | AFTER UPDATE)时,行触发器内部不能出现更改被触发表中数据的操作;触发事件为数据删除(BEFORE | AFTER DELETE)时,行触发器内部不能出现删除被触发表中数据的操作。
- 在一个表上最多可创建8个触发器。
- 不支持在本地临时表上创建触发器。
- 普通用户的触发器不允许基于SYS用户表进行创建。
语法格式
CREATE [ OR REPLACE ] TRIGGER [ schema_name. ]trigger_name { BEFORE | AFTER } { DELETE | INSERT | UPDATE | MERGE [ OF column_name[,...] ] } [ OR ... ] ON table_name [FOR EACH ROW] [ param_list ] BEGIN statements; END;
参数说明
- OR REPLACE
如果触发器已经存在,替换原有的触发器。
- schema_name
要创建的触发器所有者。
- trigger_name
要创建的触发器的名称。
- { BEFORE | AFTER }
指定触发时间。BEFORE表示在数据库动作之前触发器执行;AFTER表示在数据库动作之后触发器执行。
- { DELETE | INSERT | UPDATE | MERGE [ OF column_name[,...] ] } [ OR ... ]
触发事件,指明哪些数据库动作会触发此触发器。
- DELETE表示数据库删除会触发此触发器。
- INSERT表示数据库插入会触发此触发器。
- UPDATE表示数据库修改会触发此触发器。
- MERGE表示从其他数据源中更新或插入时,会触发此触发器。
- [ OR ... ]表示指定的多个触发事件之间用OR连接,例如,INSERT OR DELETE表示触发事件是插入操作和删除操作。
- table_name
数据库触发器所在的表。
- [FOR EACH ROW]
使用FOR EACH ROW的触发器为行级触发器;不使用FOR EACH ROW的触发器为语句级触发器。
- param_list
声明参数列表。声明语法请参见声明语法。
- statements
触发器语句块。不允许为空,为空会报错。可以使用基本语句、动态语句、控制语句、异常语句或其他语句。基本语句详情请参见基本语句,动态语句详情请参见动态语句,控制语句详情请参见控制语句,其他语句详情请参见其他语句,自定义函数详情请参见自定义函数,自定义存储过程请参见创建存储过程。
示例
--删除已经存在的表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;
创建触发器时,最后的“/”符号用于标示触发器定义语句的结束,不能省略,且必须单独成行。
--创建一个触发器,在往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.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论