精通Oracle触发器:介绍常见类型(oracle触发器类型)
的触发器
Oracle触发器是Oracle数据库中的一种功能,能够自动监测表或表数据的变更情况,从而进行一些操作,是用来替代PL / SQL存储过程完成日常数据库操作的非常有用的工具。下面介绍常见类型的触发器。
一、行级触发器
行级触发器,就是在指定表的数据发生变化时被触发执行的触发器,根据不同类型的变化,可以分成三种:
1. INSERT :它会在新记录插入表中时被触发。一般用来对新插入的记录的初始值做检查和处理。
2. UPDATE:它会在某一列的值发生了变化时被触发,一般用来对发生变化的列做检查和处理。
3. DELETE:它会在删除表的记录时被触发,可以用来保存被删除的记录中的数据,比如某些历史记录。
示例:一个行级触发器的示例,用于监控表中每一行新插入记录时,验证INSERT_DATE是否为当前日期:
CREATE OR REPLACE TRIGGER T_INSERT_DATE
BEFORE INSERT ON TABLE_T
REFERENCING NEW AS N
FOR EACH ROW
BEGIN
IF (N.INSERT_DATEsysdate) THEN
RAISE_APPLICATION_ERROR(-20000, ‘插入的记录的日期必须为当前日期’);
END IF;
END;
二、表级触发器
表级触发器是指触发器与表本身关联,无论表中发生什么类型的变化,表级触发器都会被触发,它与行级触发器的区别在于触发器定义在表级,而不是在行级。
同样,它也在BEFORE 和 AFTER 两种时刻中运行,可以同时看到OLD 和 NEW 两个数据集,但是差别在于OLD 与NEW 表示其取值的范围是表中的所有数据,而表级触发器中没有 FOR EACH ROW 语句。
示例:一个表级触发器的示例,用于监控表上任何变更操作时,都要求保证NAME字段处于大写形式:
CREATE OR REPLACE TRIGGER T_NAME_UPPERCASE
BEFORE INSERT OR UPDATE ON TABLE_T
REFERENCING NEW AS N
BEGIN
IF UPPER(N.NAME)N.NAME THEN
RAISE_APPLICATION_ERROR(-20000, ‘Name字段必须为大写形式’);
END IF;
END;
三、系统级触发器
系统定义的触发器(系统级触发器)表示系统的特殊事件,在系统发生特定的改变时被触发。
它与表和行级触发器的区别是,它不需要关联任何表,而是识别一些系统特定的操作,比如用户的登录和注销,数据库拆卸和启动等。
系统定义的触发器可以实现复杂的工作流控制和通知构建,比如定时同步数据库或定时发送邮件等。
示例:一个系统级触发器的示例,每次用户登录数据库时,要求返回一个welcome文本:
CREATE OR REPLACE TRIGGER T_WELCOME
AFTER LOGON ON DATABASE
BEGIN
DBMS_OUTPUT.PUT_LINE(‘Welcome to Oracle Database’);
END;
精通Oracle触发器,可以让我们更好地控制数据库,让复杂的操作变得更加高效。上述介绍了Oracle触发器的三种常见类型:行级触发器、表级触发器和系统级触发器,分别用于不同场景下