Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
INSTEAD OF 触发器,也称替换触发器,是一种特殊的触发器,和其他建立在数据表上的触发器不同,INSTEAD OF 触发器建立在视图上。
在 Oracle 数据库中,复杂的视图常从多个数据表中获取数据有的视图还包含分组等计数函数,因此一般不允许对视图施加 DML操作,但是使用 INSTEAD OF 触发器,在触发器内通过定义的PL/SQL块,完成间接地对视图进行 DML操作。
下面就通过范例来学>INSTEAD OF 触发器的创建和使用。
在介绍 INSTEAD OF 触发器之前,首先创建一个视图,该视图关联数据表 emp 和 dept,代码如下所示。
CREATE VIEW test_view AS
SELECT empno,ename,dept.deptno,dname
FROM emp,dept
WHERE emp.deptno=dept.deptno;
由于 scott 用户没有创建视图的权限,因此首先应给该用户赋予创建视图的权限,如下所示。
CONN sys/change_on_install AS SYSDBA,GRANT CREATE VIEW to scott;
然后重新连接到 scott 用户下,创建前述视图。现在向该视图插入如下数据。
INSERT INTO temp_vieW VALUES(1234,’zhangsan’,'50’,chairman’)
运行代码时会出现如下错误。
如果想修改视图的内容,只有通过创建INSTEAD OF 触发器来实现。
创建INSTEAD OF 触发器以实现修改视图 test view 中的内容
视图 test_view实际上来源自两个数据表,这两个数据表通过 deptno 字段建立关联。
在Oracle 数据库中,一般要想通过 DML操作修改视图是不可行的,因为修改视图实际上是修改对应数据表中的内容,
两张数据表中数据是关联的,修改的时候,必须保证两个数据表关联字段同时修改或者增加。
下图是 INSTEAD OF 触发器的创建代码,
如下图所示,在触发体内,首先判断 dept 中是否存在要插入记录的部门编号,如果存在,则只需在emp 中添加记录就行了,
如果不存在,这时系统认为是 EXCEPTION,此时需要向两个表中都添加数据。
如已经创建替换触发器,可以试一下插入数据,如下图所示,
我们可以看出,现在可以实现向视图中插入数据