概述
创建触发器:
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标识符获取新旧数据;
- 又称替代触发器,用于执行一个替代操作来代替触发事件的操作,触发事件本身最终不会被执行;
- 如果是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权限;
最后
以上就是老实外套为你收集整理的触发器类型的全部内容,希望文章能够帮你解决触发器类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复