1.简介
触发器就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。触发器不需要人为的去调用,也不能调用。触发器的触发条件其实在你定义的时候就已经设定好了。并且,触发器不能接收参数(自动执行,定义时设置触发条件)
2.功能
①、 允许/限制对表的修改
②、 自动生成派生列,比如自增字段
③、 强制数据一致性
④、 提供审计和日志记录
⑤、 防止无效的事务处理
⑥、 启用复杂的业务逻辑
语法(一般):
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件 ON表名/视图名 [FOR EACH ROW] //加上FOR EACH ROW 即为行级触发器,不加时为语句级触发器 BEGIN pl/sql语句 END
3.分类
①DML触发器(行级触发器): 可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
包括:insert 、update 、delete
语法:
CREATE OR REPLACE TRIGGER TRIGGER1 AFTER INSERT ON TRIGGERTEST //插入后触发 FOR EACH ROW //行级触发器 BEGIN INSERT INTO tab1(ID,NAME) VALUES('22','33'); END;
②替代触发器(instead of触发器) :
由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作。
语法:
CREATE [OR REPLACE] TRIGGER trigger_name INSTEAD OF {INSERT|DELETE|UPDATE [OF COLUMN...]} [OR {INSERT| DELETE| UPDATE [OF COLUMN...]}] ON VIEW_NAME [REFFERENCING{OLD [AS] OLD | NEW [AS] NEW| PARENT AS PARENT}] // 可以指定相关名称,当前的默认相关名称为OLD和NEW,
应用相关名称时需要加: [FOR EACH ROW] //instead of 触发器只能在行级上触发,因为没有必要指定 [WHEN CONDITION] DECLARE
BEGIN END;
③系统触发器:
ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
1.DDL 触发器:
当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化
2.DB事件触发器:
当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况
注意:DDL 和 DB事件触发器必须要有DBA权限
语法:
CREATE OR REPLACE TRIGGER [sachema.]trigger_name
{BEFORE|AFTER}
{ddl_event_list | database_event_list} // ddl_event_list:一个或多个DDL 事件,事件间用 OR 分开;database_event_list:一个或多个数据库事件,事件间用 OR 分开;
ON { DATABASE | [schema.]SCHEMA }
[WHEN condition]
PL/SQL_block | CALL procedure_name;
4.组成
◆触发事件:引起触发器被触发的事件。 例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
◆触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
◆触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
◆触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
◆触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
◆触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;
行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
5.注意事项:
① 触发器不接受参数。
②一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
③在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
④触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
⑤在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。
⑥触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
⑦在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
⑧在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能是表中的任何long和blob列。
⑨不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。
6.触发次序
执行 BEFORE语句级触发器; --> 对与受语句影响的每一行: --> 执行 BEFORE行级触发器 --> 执行 DML语句 --> 执行 AFTER行级触发器 --> 执行 AFTER语句级触发器
(参考:https://www.cnblogs.com/xiaoyuersdch/p/7169773.html)