admin 管理员组文章数量: 1086019
2024年3月13日发(作者:百度搜索代码免费)
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 =;
视图已创建。
(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> 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 %type;
7 begin
8 insert into emp(empno,ename,job,sal)
9 values(:,:,:,:);
10
11 select deptno
12 into var_deptno
13 from dept
14 where dname=:;
15
16 update emp
17 set deptno=var_deptno
18 where empno=:;
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触发器替换系统预定义的操作。
版权声明:本文标题:Oracle INSTEAD OF 触发器 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1710314600a567496.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论