触发器,就是当特定事件出现时自动执行的代码块。
触发器的功能:
1、允许/限制对表的修改。
2、自动生成派生列。
3、强制数据一致性。
4、强制复杂的完整性约束。
5、提供审计和日志记录。
6、防止无效的事务处理。
7、启用复杂的业务逻辑。
触发器和存储过程的区别:触发器是自动执行的,因此触发器不能显示调用。而存储过程可以被调用。
触发器是一个对数据进行监控的对象,触发器的缺点:性能低下。
触发器的语法:触发器与特定的表或视图相关联,用于检查对表或视图所做的数据修改。
CREATE OR REPLACE TRIGGER tigger_name
{BEFORE | AFTER | INSTEAD OF} --1,BEFORE和 AFTER指在时间发生之前或之后激活触发器。
{INSERT|DELETE|UPDATE[OF column[,column]……]} --2
[OR{INSERT|DELETE|UPDATE [OF column[,column]……]}]
ON[schema.]table_or_view_name --table_or_view_name指要创建触发器的表或视图
[REFERENCING [NEW AS new_row_name] [OLD AS old_row_name]] --3
[FOR EACH ROW] --指定是否对受影响的每行都执行触发器,即行级触发器
[WHERE(condition)] --限制执行触发器的条件,该条件可以包括新旧数据值的检查
[DECLARE --PL/SQL块
variable_declation]
BEGIN
statements;
[EXCEPTION
exception_handlers]
END[tigger_name];
1、 INSTEAD OF表示可以执行触发器代码来代替导致触发器调用的时间。
2、INSERT|DELETE和UPDATE指定构成触发器事件的数据库操作类型,UPDATE还可以指定列的列表。
3、REFERENCING指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLD。
案例11:作用在表employees上的触发器。当对表进行插入和更新操作之前,如果position字段的值不是5那么我们会同时吧新增的这条数据或者更新的数据manager_id字段赋值为2。即如果职位不是部门经理,那么就把这个员工的经理指定为ID为2的员工。
CREATE OR REPLACE TRIGGER trig_emp
BEFORE INSERT OR UPDATE OF position
ON employees
FOR EACHROW
WHEN(NEW.position <> 5)
BEGIN
:NEW.manager_id :=2;
END;
将触发器分为三部分:触发器语句、触发器限制和触发器操作。
触发器语句是那些可以导致触发器的事件,即在表或视图上执行的INSERT、DELETE、和UPDATE之类的DML语句,在模式对象上执行的DDL语句或数据库事件。
触发器限制:触发器限制条件必须包含一个布尔表达式,该值必须为“真”才能激活激发起。如果该值为“假”或“未知”,将不运行触发操作。
触发器的操作:是触发器的主体,包含一些SQL语句和代码,这些代码在执行触发器语句且触发器限制条件的值为“真”时运行。行级触发器运行触发操作中的语句访问行的列值。
触发器的类型:1、行级触发器,2、语句级触发器,3、INSTEADOF触发器,4、模式触发器,5、数据库触发器。
行级触发器和语句级触发器合称为DML触发器。INSTEADOF触发器只要是在视图上定义的触发器。模式触发器也就是用户事务触发器。数据库级触发器是指创建在数据库事件上的触发器。
行级触发器:对DML语句影响的每一行执行一次,例如,UPDATE语句影响多行,就会对每行都激活一次触发器。
可以在CREATE TRIGGER命令中指定FOR EACH ROW子句创建行级触发器。
如果要通过触发器在插入行中设置一个列值,就应该使用BEFORE INSERT触发器访问“新”值。使用AFTER INSERT触发器不允许设置插入值,因为该行已经插入表中。
而在审计应用程序中经常使用AFTER行级触发器,直到行被修改才会触发它们。行的成功修改表明此行已经通过该表定义的完整性约束。
语句级触发器,对每个DML语句执行一次。例如,如果一条INSERT语句在表中插入200行,那么这个表上的INSERT语句级触发器只执行一次。语句级触发器不常用于与数据相关的活动,通常用于强制实施在表上执行操作的额外安全性措施。
注意:语句级触发器是CREATE TRIGGER命令创建的触发器的默认类型。
案例13:表操作的日志,对表的所有操作,如更新插入删除等进行日志记录
CREATE OR REPLACE TRIGGER trig_idaddt
AFTER INSERT OR UPDATE OR DELETE
ON idaddt
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE(‘IDADDT中的数据已更新’);
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE(‘IDADDT中的数据已删除’);
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE(‘数据已插入IDADDT’);
END IF;
END;
INSTEAD OF触发器,用来替换所使用实际语句的触发器。这样可以运行用户修改不能直接用DML语句修改的视图。
模式触发器,也叫用户事件触发器,它是在模式级的操作上建立的触发器,如CREATE、ALTER、DROP等DDL语句。用户可以创建触发器来防止删除自己创建的表。
触发器的管理,触发器的两种状态:DISABLED状态表示触发器非启用状态,ENABLED状态表示触发器已经启用。触发器一旦创建立即生效,有时有可能需要临时禁用触发器,最常见的原因就是数据加载。
触发器的启用和禁用语句语法:ALTER TRIGGER tigger_name{ENABLE|DISABLE};
触发器的删除语法:DROP TRIGGER <tigger_name>;
触发器的查看:SQL>DESC USER_TRIGGERS;