您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

南大通用GBase8s 常用SQL语句(九十六)

INSERT 事件和 DELETE 事件

表上的 INSERT 和 DELETE 事件由那些关键字和 ON table 子句定义,使用以下语法。

在表上 INSERT 或 DELETE 事件

 

元素

描述

限制

语法

table

触发表的名称

必须在数据库中存在

标识符

当 INSERT 语句在其 INTO 子句中包含指定的 table (或 table 的同义词)时, Insert 触发被激活。同样地,当 DELETE 语句在其 FROM 子句中包含指定的 table (或 table 的同义词)时,Delete 触发器被激活。

如果 Insert 触发器指定的 table 是包含 Insert 子句的 MERGE 语句的目标表,则 MERGE 语句也可以激活 Insert 触发器,同样地,如果 Delete 触发器指定的 table 是包含 Delete 子句的 MERGE 语句的目标表,则 MERGE 语句也可以激活 Delete 触发器。

当 TRUNCATE TABLE 语句删除表的所有行时,它不会激活 Delete 触发器。如果要对一个表定义启用的 Delete 触发器,而您不具有此表的 Alter 特权,则如果您视图移除此表,即使 TRUNCATE 语句不是 Delete 触发器的触发事件,数据库服务器仍会返回错误。(有关删除操作所需的自由访问权的更多信息,请参阅 TRUNCATE 语句。)

对于视图上的触发器,INSTEAD OF 关键字必须紧跟在指定触发事件类型的 INSERT 、DELETE 或 UPDATE 关键字之前,且视图(而不是表)的名称或同义词必须跟在 ON 关键字之后。视图上的 INSTEAD OF 触发器部分描述定义 INSTEAD OF 触发事件的语法。

一个表上可以定义多个 Insert 触发器和多个 Delete 触发器。

如果您在表层次结构中的子表上定义触发器,且子表支持级联删除,则超级表上的 DELETE 操作将激活子表上的 Delete 触发器。

关于 Insert 触发器和 Delete 触发器的操作上的相关性和限制的信息,另请参阅触发器的再进入一节。

UPDATE 事件

UPDATE 事件(和 SELECT 事件)可以包含可选的 column 列表、

UPDATE 事件

 

元素

描述

限制

语法

column

激发触发器的列

必须在触发表中存在

标识符

table

触发表的名称

必须数据库中存在

标识符

column 列表是可选的。如果您忽略 OF column 列表,则更改 table 的任何列都将激活触发器。

OF column 子句对于视图上的 INSTEAD OF 触发器是无效的。

在两种情况下,触发表上的 UPDATE 可以激活触发器:

  1. UPDATE 语句引用 column 列表中的任何列。
  2. UPDATE 事件定义未指定 OF column 列表规范。

无论它更新 column 列表中的一列还是激活多列,触发 UPDATE 语句都只激活 Update 触发器一次。

如果指定没有 columns 列的触发器 table 是 MERGE 语句的目标表,或者如果 MERGE 语句的 Update 子句引用了Update 触发器的 column 列表中的列,则 MERGE 语句也可以激活 Update 触发器。

定义多个 Update 触发器

一个表上的多个 Update 触发器不能包含相同的列。在以下示例中,trig3 items 表上是无效的,因为它的列列表包含 stock_num ,而 stock_num 是 trig1 中的触发列。

CREATE TRIGGER trig1 UPDATE OF item_num, stock_num ON items

        REFERENCING OLD AS pre NEW AS post

        FOR EACH ROW(EXECUTE PROCEDURE proc1());

CREATE TRIGGER trig2 UPDATE OF manu_code ON items

        BEFORE(EXECUTE PROCEDURE proc2());

  CREATE TRIGGER trig3 UPDATE OF order_num, stock_num ON items

        BEFORE(EXECUTE PROCEDURE proc3());

当 UPDATE 语句尝试更新具有不同触发器的多个列时,触发列的列编号确定触发执行的顺序。从编号最小的触发列开始执行,且按顺序一直执行到编号最大的触发列。但是,如果在同一列或同一组列上设置了多个 Update 触发器,则不保证触发器的执行顺序。

以下示例显示表 taba 具有四列(a 、 b 、 c 、 d):

CREATE TABLE taba (a int, b int, c int, d int);

trig1 定义为列 a c 上的更新,将 trig2 定义为列 b 和 d 上的更新,如以下示例所示:

CREATE TRIGGER trig1 UPDATE OF a, c ON taba

        AFTER (UPDATE tabb SET y = y + 1);

        

CREATE TRIGGER trig2 UPDATE OF b, d ON taba

        AFTER (UPDATE tabb SET z = z + 1);

以下示例显示 Update 触发器的触发语句:

UPDATE taba SET (b, c) = (b + 1, c + 1);

然后列 a 和 c 的 trig1 首先执行,列 b  d 的 trig2 随后执行。在此情况中,触发器中列编号最小的是第 1 列(a),第二小的是第 2 列(b)。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进