Oracle  instead of 触发器
INSTEAD OF 触发器也称替代触发器,定义INSTEAD OF触发器后,用户对表的DML操作将不再被执行,而是执行触发器主体中的操作。通常情况下,INSTEAD OF触发器是定义在视图上的,而不是在表上定义的触发器,它是用来替换所使用实际语句的触发器。
因为一个视图通常是由多个基表连接而成,这种视图是不允许进行INSERT、UPDATE和DELETE这样的DML操作。当为视图编写INSTEAD OF触发器后,用户对视图的DML操作就不会执行,而是执行触发器中的PL/SQL语句块,这样就可以通过在INSTEAD OF触发器中编写适当的代码,完成对构成视图的各个表进行操作。
替代触发器与其他触发器类以,只是在触发器定义的头部使用INSTEAD OF子句。下面通过一个示例来演示INSTEAD OF触发器的应用。
(1)创建一个视图,显示雇员的基本信息和所在部门名称。
SQL> connect system/admin
已连接。
SQL> grant create view to scott;
授权成功。
SQL> connect scott/tiger
已连接。
SQL> create view emp_dep_view
  2  as select empno,ename,job,sal,dname
  3    from emp,dept
  4  where emp.deptno=dept.deptno;
视图已创建。
(2)如果试图向表中添加记录,则由于视图引用了两个基表,所以添加记录将失败。
SQL> insert into emp_dep_view(empno,ename,job,sal,dname)
  2  values(8000,'董鹏','MANAGER',1500,'SALES');
insert into emp_dep_view(empno,ename,job,sal,dname)
                                            *
第 1 行出现错误:
ORA-01776: 无法通过联接视图修改多个基表
(3)现在为视图emp_dep_view创建一个INSTEAD OF触发器,以便使用自定义的操作覆盖系统预定义的操作。
sql触发器的使用SQL> create or replace trigger insert_emp_deb_trigger
  2    instead of
  3    insert on emp_dep_view
  4    for each row
  5  declare
  6    var_deptno emp.deptno%type;
  7  begin
  8    insert into emp(empno,ename,job,sal)
  9    values(:pno,:ame,:new.job,:new.sal);
10
11    select deptno
12    into var_deptno
13    from dept
14    where dname=:new.dname;
15
16    update emp
17    set deptno=var_deptno
18    where empno=:pno;
19  end insert_emp_deb_trigger;
20  /
触发器已创建
(4)使用同样的语句测试触发器,并查看触发器的运行情况。
SQL> insert into emp_dep_view(empno,ename,job,sal,dname)
  2  values(8125,'董鹏','MANAGER',1500,'SALES');
已创建 1 行。
SQL> select empno,ename,job,sal,dname
  2  from emp_dep_view
  3  where dname='SALES';
  EMPNO    ENAME      JOB          SAL  DNAME
  ----------    ----------      ---------        ----------    --------------
    7499    ALLEN      SALESMAN    1600    SALES
….
已选择7行。
视图emp_dep_view显示了雇员的基本信息和所在部门的名称,当向该视图添加数据时,本意是将雇员的基本信息添加到EMPLOYEES表,并使用部门名称对应的部门号添加到EMP表的DEPT列。当直接通过视图添加数据时,由于系统无法预知用户添加数据的本意,所以用户需要使用INSTEAD OF触发器替换系统预定义的操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。