-
在视图上定义替代触发器
- 定义:对视图进行触发器的定义,被称为替代(instead-of)触发器;
-
视图的问题:如果定义了一个由多张数据表一起显示的视图,这个时候用户是无法对此视图执行更新或增加数据的操作的;
-
通过一个示例,说明这个问题:创建一张包含20部门雇员编号、姓名、职位、基本工资、部门编号、部门名称、位置的视图;
-
CREATE OR REPLACE VIEW v_myview AS SELECT e.empno , e.ename , e.job , e.sal , d.deptno , d.dname , d.loc FROM emp e,dept d WHERE e.deptno=d.deptno AND d.deptno=20 ; |
-
向视图插入一条数据
INSERT INTO v_myview (empno , ename, job , sal , deptno,dname,loc) VALUES (6688, '魔乐' , 'CLERK' , 2000, 50 , '教学' , '北京') ; |
运行结果: 错误报告: SQL 错误: ORA-01776: 无法通过联接视图修改多个基表 |
-
可通过替代触发器对视图所映射的数据表直接及进行操作:
- 创建语法:
-
注意:替代触发器可以解决视图的一些更新操作问题,但对于不可更新的视图依然无法实现操作,当视图中包含了以下的结构之一,就表示为不可更新的视图:
- 统计函数;
- CASE或DECODE语句;
- GROUP BY,HAVING子句;
- DISTINCT消除重复列;
- 集合运算连接;
-
实现视图增加数据的替代触发器
- 说明:因为视图本身由多张数据表查询得来,想实现数据增加,就要将这些增加的数据设置到不同的表中,可用替代触发器完成;
-
示例1:创建一个INSERT替代触发器,用于执行视图更新操作
-
分析:
- 由于此时需要通过视图执行数据增加操作,所以要在替代触发器中实现具体的增加数据操作,分别将要增加的dept及emp<
-