Oracle---触发器

一、触发器的概念   

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示式调用才执行,而触发器是由一个事件来启动运行,即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。


二、触发器的类型

1.DML触发器

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

2.替代触发器

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

3.系统触发器

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

三、触发器的创建

1.触发器组成

触发事件:引起触发器被触发的事件。

    例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)DDL语句(如CREATEALTERDROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。

 

触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。

 

触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。

例如:PL/SQL 块。

触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。

 

触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。

 

触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。

语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;

行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

 

编写触发器时,需要注意以下几点:

(1)触发器不接受参数。

(2)一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个,并且各触发器之间不能有矛盾。

(3)在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。

(4)触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。

(5)在触发器的执行部分只能用DML语句(SELECTINSERTUPDATEDELETE),不能使用DDL语句(CREATEALTERDROP)。

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

(7)在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

(8)在触发器主体中不能申明任何Longblob变量。新值new和旧值old也不能是表中的任何longblob列。

(9)不同类型的触发器(DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。


2.触发器的创建

例1:前触发器

create or replace trigger tr_del_emp

 before delete

  onemp

  foreach row

begin

 insert into emp_his(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)

 values(:old.EMPNO,:old.ENAME,:old.JOB,:old.MGR,:old.HIREDATE,:old.SAL,:old.COMM,:old.DEPTNO);

end;


你可能感兴趣的:(oracle,触发器,用户,数据库系统)