1.概念

触发器和存储过程类似,可以调用存储过程,但是触发器不需要调用,触发器只能由数据可的特定事件来触发。

特定的触发事件:

用户在指定的表或视图中座DML操作,主要有:insert,update,delete等。

用户做DDL操作,主要有:create,alter,drop等。

数据库事件,主要包括:logon/logoff用户的登录或注销。

startup/shutdown数据库的打开或关闭。

erros特定的错误信息等。

2.作用

触发器可以根据不同的事件进行调用,有着更加精细的控制能力,可以完成很多普通语句完成不了的功能,主要作用:

自动生成自增长的字段。

执行更复杂的业务逻辑。

防止无意义的操作。

提供审计。

允许或限制修改某些表。

实现完整性规则。

保证数据的同步复制。

3.类型

3.1 DML触发器

ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

3.2 替代触发器

由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。

3.3 系统触发器

ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

4.案列分析

--建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;

CREATE OR REPLACE TRIGGER tr_del_emp

   BEFORE DELETE --指定触发时机为删除操作前触发

   ON scott.emp

   FOR EACH ROW   --说明创建的是行级触发器

BEGIN

--将修改前数据插入到日志记录表 del_emp ,以供监督使用。

INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )

       VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );

END;

--检查一下

DELETE emp WHERE empno=7788;
select * from emp_his where empno=7788;

file
注意:
在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。

触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。

Related Posts