概述
触发器时大型关系型数据都会提供的一种技术,用来监视数据库的各种操作。
触发器的基本原理
触发器类似于过程、函数,其包括声明部分和异常处理部分,并且都有名称,都存储在数据库中。但是于普通的函数、过程不同的是:函数需要用户显示的调用才能完成,触发器则是当某件事发生的时,由数据库自动执行。
触发器的基本原理
触发器的类型
触发器的类型分为三种
- DML触发器:对表或者视图执行DML操作时触发。
- INSTEAD OF 触发器: 只定义在视图上用来执行替换实际的操作语句
- 系统触发器:在对数据库系统进行操作(如DDL语句、启动或者关闭数据等系统事件)时触发。
相关概念
1.触发事件
引起触发器被触发的事件。如DML语句(INSERT,UPDATE,DELETE语句对表或者视图执行数据处理操作)、DDL语句(CREATE,ALTER,DROP语句在数据库中创建,修改,删除模式对象)、数据库系统事件(系统的启动和退出,异常错误)、用户事件(如登录和退出数据库)。
2.触发条件
触发条件是由WNEN子句指定一个逻辑表达式。只有当该表达是的值为TRUE的时候,遇到的出发时间才能自动执行触发器,使其执行触发操作,否则即便是遇到了触发事件也不会执行触发器。(不使用WHEN触发条件的时候,默认应该是遇到触发事件都执行触发器)
3.触发对象
触发对象包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
4.触发时机
触发时机指的是触发器的触发时间。如果指定为BEFORE,则在DML操作前触发以便防止某些错误操作发生或实现某些业务规则;如果指定为AFTER,则在DML操作之后触发,以便记录该操作或做某些时候处理。
5.条件谓词
当触发器中包含了多个触发事件(INSERT,UPDATE,DELETE)的组合时,为了分别针对不同的事件进行不同给的处理,需要使用ORACLE数据库提供的条件谓词。
- INSERTING: 当触发事件时INSERT时,取值为TRUE,否则取值为FALSE
- UPDATING[(column1,column2,……)]:当触发事件时UPDATE时,如果修改了columnx列,则取值为TRUE,否则取值为FALSE,其中columnx是可选的。
- DELETING:当触发事件是DELETE时,取值为TRUE,否则取值为FALSE.
6.触发子类型
触发子类型分为行触发(row)和语句触发(statement)。行触发即对每一行进行操作时都要触发,而语句触发只是对这种操作触发一次。一般机型SQL语句操作时都应该时行触发,只有对整个表的安全进行检查时才是语句触发。如果此项省略,默认的触发时语句触发。
除此之外触发器中还由两个相关的值,分贝对应触发的行中的旧表值和新表值,用old和new来表示。在oracle中使用这两个值,在触发条件部分不需要加冒号,而在出发提中需要加冒号:old和:new。在mysql中不能加冒号。
创建触发器
CREATE <OR REPLACE> TRIGGER <触发器名>
触发条件
DECLARE
定义声明
BEGIN
操作
END <触发器名>
举例:
create or replace trigger testTrigger
BEFORE DELETE
on test
FOR EACH ROW
declare
BEGIN
INSERT INTO T VALUES('1','2',:OLD.AD_NM);
end testTrigger;
删除触发器
DROP TIGGER <触发器名>