视图上的 INSTEAD OF 触发器

使用 INSTEAD OF 触发器在视图上执行指定的触发操作,而不是执行触发 INSERT 、DELETE 、MERGE 或 UPDATE 语句。

语法

视图上的触发器
元素 描述 限制 语法
correlation 触发操作中限定的旧或新列值的名称( correlation.column 在此语句中必须唯一 标识符
trigger 在此为触发器声明的名称 必须在数据库中的触发器名称中是唯一的 标识符
view 触发视图的名称或同义词。可以包含 owner. qualifier 。 视图或同义词必须存在于当前数据库中 标识符

您可以使用触发操作更新视图下的表,在某些情况下更新一般“不可更新”的视图。当 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 子句中调用触发器例程。

指定的视图有时称为触发视图。此图表的左侧部分(包含视图 规范)定义触发事件。该图表的剩余部分定义相关性名称和触发操作

示例

假设 deptemp 是列出部门和员工的表:
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));
下一语句定义 manager_info,它是 deptemp 表中的列构成的视图,包含每个部门中所有的经理:
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,它是设计为向 manager_info 视图中的 deptemp 表插入行 INSTEAD OF 触发器:
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;
表、视图、触发器和 SPL 例程创建完成之后,数据库服务器将以下 INSERT 语句作为触发事件:
INSERT INTO manager_info(deptno, empno) VALUES (08, 4232);

此触发 INSERT 语句不会执行,但是该事件会导致触发操作被执行,同时调用 instab( ) SPL 例程。SPL 例程中的 INSERT 语句向 manager_info 视图中的 empdept 基本表同时都插入新值。

1 请参阅 INSTEAD OF 触发器的 Action 子句