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小时内删除。
发表评论