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触发器替换系统预定义的操作。


本文标签: 触发器 视图 使用 添加 操作