DML触发器只能应用在表上。而替代触发器只能定义在视图上。当腰对一个不能进行修改的视图进行数据的修改时,或者要修改视图中的某个嵌套表时,可以使用替代触发器。
替代触发器的作用
提到触发器,又称为INSTEAD OF触发器,它会替代原来的数据操作语句的执行,更改为使用在触发器中定义的语句来执行数据操作。
一些简单的单表视图,可以直接INSERT、UPDATE,但如果要对复杂的视图进行INSERT、UPDATE,可以通过替代触发器,将这些DML语句对视图的更改替换为对基表的 DML操作。
要注意:
- 替代触发器只能用于视图
- 当建立替代触发器时,不能指定BEFORE和AFTER选项。
- 当建立替代触发器时,视图没有指定WITH CHECK OPTION选项。
- 当建立替代触发器时,必须指定FOR EACH ROW方法。
定义替代触发器
替代触发器的定义语法和DML触发器相似,不同之处在于DML触发器中用BEFORE和AFTER指定触发时机的地方改为了INSTEAD OF,语法如下:
CREATE [OR REPLACE] TRIGGER [schema.]trigger
INSTEAD OF verb_list ON [schema.]view_name
[REFERENCING {OLD AS old} | {NEW AS new} | {PARENT AS parent}]
FOR EACH ROW
[WHEN (condition)]
plsql_block | call_procedure_statement
下面的代码创建了一个视图和一个替代触发器:
--创建视图emp_dept视图
CREATE OR REPLACE VIEW scott.emp_dept (empno,
ename,
job,
mgr,
hiredate,
sal,
comm,
deptno,
dname,