触发器类型

来源:互联网 发布:小知科技 编辑:程序博客网 时间:2024/05/30 23:10

创建触发器:

create [or replace] trigger trigger_name

[before | after | instead of] trigger_event

{on table_name | view_name | database}

[for each row]

[enable | disable]

[when trigger_condition]

[declare declaration_statements;]

begin

    trigger_body;

end [trigger_name];

触发器功能强大,但过多的依靠触发器会使得数据库的维护变得相当困难,所以在使用触发器时要慎重。

1)DML触发器

  • 由DML语句(insert、update、delete)触发;
  • 按触发时间可以分为before触发器和after触发器,分别表示在DML时间发生之前与之后采取行动;
  • 按触发级别可以分为语句级触发器和行级触发器,其中,语句级触发器针对某一条语句触发一次,而行级触发器则针对语句所影响的每一行都触发一次。例如某条update语句修改了表中的100行数据,那么针对该update事件的语句级触发器被触发一次,而行级触发器将被触发100次;
  • 在行级触发器中,为了获取某列在DML操作前后的数据,Oracle提供了两种特殊的标识符:old和:new,通过:old.column_name可以获取该列的旧数据,通过:new.column_name可以获取该列的新数据。insert触发器只能使用:new,delete触发器只能使用:old,而update触发器则两种都可以使用;
  • 语句级触发器无法使用:new和:old标识符获取新旧数据;
2)instead of 触发器

  • 又称替代触发器,用于执行一个替代操作来代替触发事件的操作,触发事件本身最终不会被执行;
  • 如果是DML触发器,则无论是before触发器还是after触发器,触发事件最终都会被执行;
  • Oracle中的instead of 触发器不能针对表,只能针对视图;
  • 若对列进行了数学或函数计算,则不能对该列进行DML操作,可以用instead of触发器(例如:向一个有函数计算的视图中添加记录,若直接执行insert语句,则报错。若创建有对应的instead of insert触发器,则可以正常执行insert语句);

3)系统事件触发器

  • 在发生如数据库启动或关闭等系统事件时触发;
  • 支持的系统事件有:logoff、logon、servererror、shutdown、startup;
  • 对于logoff和shutdown事件只能创建before触发器,对于logon、servererror、和startup事件只能创建after触发器;
  • 创建系统事件触发器需要使用on database字句;
  • 创建系统事件触发器需要用户具有DBA权限;

4)DDL触发器

  • 由DDL语句(create、alter、drop、grant、comment、revoke、truncate等)触发,也可分为before、after触发器;
  • 创建DDL触发器需要用户具有DBA权限;

0 0
原创粉丝点击