使用 INSTEAD OF 触发器在视图上执行指定的触发操作,而不是执行触发 INSERT 、DELETE 、MERGE 或 UPDATE 语句。
您可以使用触发操作更新视图下的表,在某些情况下更新一般“不可更新”的视图。当 INSERT 、DELETE 或 UPDATE 语句引用数据库中的特定列时,您还可以使用 INSTEAD OF 触发器替换其它操作。
在 INSTEAD OF UPDATE 触发器的可选的 REFERENCING 子句中,新相关性名称可以出现在旧相关性名称之前或之后。
在 GBase 8s 中,CREATE FUNCTION 和 CREATE PROCEDURE 的语句中支持同一 REFERENCING OLD 和 REFERENCING NEW 语法,以在触发例程中定义相关性名称。可以在 REATE FUNCTION 或 CREATE PROCEDURE 语句(定义触发器例程)的 FOR 子句中指定的视图上的 INSTEAD OF 触发器的 Action 子句中调用触发器例程。
指定的视图有时称为触发视图。此图表的左侧部分(包含视图 规范)定义触发事件。该图表的剩余部分定义相关性名称和触发操作。
CREATE TABLE dept ( deptno INTEGER PRIMARY KEY, deptname CHAR(20), manager_num INT ); CREATE TABLE emp ( empno INTEGER PRIMARY KEY, empname CHAR(20), deptno INTEGER REFERENCES dept(deptno), startdate DATE ); ALTER TABLE dept ADD CONSTRAINT(FOREIGN KEY (manager_num) REFERENCES emp(empno));
CREATE VIEW manager_info AS SELECT d.deptno, d.deptname, e.empno, e.empname FROM emp e, dept d WHERE e.empno = d.manager_num;
CREATE TRIGGER manager_info_insert INSTEAD OF INSERT ON manager_info --defines trigger event REFERENCING NEW AS n --new manager data FOR EACH ROW --defines trigger action (EXECUTE PROCEDURE instab(n.deptno, n.empno)); CREATE PROCEDURE instab (dno INT, eno INT) INSERT INTO dept(deptno, manager_num) VALUES(dno, eno); INSERT INTO emp (empno, deptno) VALUES (eno, dno); END PROCEDURE;
INSERT INTO manager_info(deptno, empno) VALUES (08, 4232);
此触发 INSERT 语句不会执行,但是该事件会导致触发操作被执行,同时调用 instab( ) SPL 例程。SPL 例程中的 INSERT 语句向 manager_info 视图中的 emp 和 dept 基本表同时都插入新值。