触发器

触发器,就是当特定事件出现时自动执行的代码块。

 触发器的功能:

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值