视图上的 INSTEAD OF 触发器
视图是使用 CREATE VIEW 语句创建并使用 SELECT 语句定义的虚拟表。每个视图由若 干行列集合组成,它们是在您每次通过查询引用该视图时,由其视图定义中的 SELECT 语 句返回的。要在视图的基本表中插入、更新或删除行,可以定义 INSTEAD OF 触发器。
与表上的触发器不同,视图上的 INSTEAD OF 触发器导致 GBase 8s 忽略触发事件,而只 执行触发操作。
有关 CREATE VIEW 语句和 INSTEAD OF 触发器语法和规则的信息,包括将对视图插入 行的 INSTEAD OF 触发器的示例,请参阅《GBase 8s SQL 指南:语法》。
13.8.1 使用 INSTEAD OF 触发器对视图进行更新
在创建一个或多个表之后(如下例中名为 dept 和 emp 的表),然后又创建了基 于 dept 和 emp 的视图(如名为 manager_info 的视图)之后,使用 INSTEAD OF 触发器更 新该视图。
以下 CREATE TRIGGER 语句创建 manager_info_update,这是一个 INSTEAD OF 触发器, 用来通过 manager_info 视图更新 dept 和 emp 表中的行。
CREATE TRIGGER manager_info_update INSTEAD OF UPDATE ON manager_info REFERENCING NEW AS n FOR EACH ROW (EXECUTE PROCEDURE updtab (n.empno, n.empname, n.deptno,)); CREATE PROCEDURE updtab (eno INT, ename CHAR(20), dno INT,) DEFINE deptcode INT; UPDATE dept SET manager_num = eno where deptno = dno; SELECT deptno INTO deptcode FROM emp WHERE empno = eno; IF dno !=deptcode THEN UPDATE emp SET deptno = dno WHERE empno = eno;
END IF; END PROCEDURE;
在创建了表、视图、触发器和 SPL 例程以后,数据库服务器将下面的 UPDATE 语句视作 触发事件:
UPDATE manager_info SET empno = 3666, empname = "Steve" WHERE deptno = 01;
此触发 UPDATE 语句不会得到执行,但是此事件将造成执行触发器操作,即调 用 updtab() SPL 例程。SPL 例程中的 UPDATE 语句将值更新到manager_info 视图 的 emp 和 dept 基本表中。




