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

SELECT 事件

DELETE 和 INSERT 事件由那些关键字(和 ON table 子句),但是 SELECT 和 UPDATE 事件还支持可选的 column 列表。

SELECT 事件

 

元素

描述

限制

语法

column

激活触发器的列

必须在触发 table 中存在

标识符

owner

table 的所有者

必须拥有 table

所有者名称

table

触发表的名称

必须在数据库中存在

标识符

如果您在同一个表上定义多个 Select 触发器,则每个触发器的 column 列表可以是唯一的或者是另一个 Select 触发器的重复。

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

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

(但是,接下来的部分描述可能影响 SELECT 语句是否激活 Select 触发器的其它情况。)

无论它指定 column 列表中的一列还是激活多列,触发 SELECT 语句都只激活 Select 触发器一次。

Select 触发器的操作不能在触发表上包含 UPDATE 、INSERT 或 DELETE 。Select 触发器的操作可以在不是触发表的其它表上包含 UPDATE 、INSERT 或 DELETE 操作。以下示例在表的一列上定义 Select 触发器:

CREATE TRIGGER mytrig

        SELECT OF cola ON mytab REFERENCING OLD AS pre

        FOR EACH ROW (INSERT INTO newtab VALUES('for each action'));

您不能对视图上的 INSTEAD OF 触发器指定 SELECT 事件。

Select 触发器被激活时的情况

在这些情况中,在触发表上的查询激活 Select 触发器:

  1. SELECT 语句是独立的 SELECT 语句。
  2. SELECT 语句在选择列表中调用 UDR 中发生。
  3. SELECT 语句是 Projection 列表中的子查询。
  4. SELECT 语句是 FROM 子句中的子查询。
  5. SELECT 语句在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 调用的 UDR 中发生。
  6. SELECT 语句从表层结构中的超级表选择数据。在此情况中,SELECT 语句激活层次结构中的超级表和所有子查询的 Select 触发器。

有关不激活 Select 触发器的 SELECT 语句的信息,请参阅 Select 触发器未激活时的情况。

独立 SELECT 语句

如果触发列出现在 SELECT 语句的 Projection 子句的选择列表中,则 Select 触发器被激活。

例如,如果 Select 触发器被定义为当表 tab1 的列 col1 被选择时执行,则以下两个独立 SELECT 语句都激活 Select 触发器;

SELECT * FROM tab1;

SELECT col1 FROM tab1;

选择列表中的 UDR 中的 SELECT 语句

如果 UDR 在其语句块中包含 SELECT 语句,则 Select 触发器被 UDR 激活,且 UDR 还显示在 SELECT 语句的 Projection 子句的选择列表中。例如,假设名为 my_rtn 的 UDR 在其语句块中包含此 SELECT 语句:

SELECT col1 FROM tab1;

限制假设以下 SELECT 语句在其选择列表中调用 my_rtn UDR :

SELECT my_rtn() FROM tab2;

当执行 my_rtn UDR 时,该 SELECT 语句激活表 tab1 的列 col1 上定义的 Select 触发器。

EXECUTE PROCEDURE 和 EXECUTE FUNCTION Call 的 UDR

如果 UDR 在其语句块中包含 SELECT 语句且 UDR 被 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 语句调用,则 Select 触发器被 UDR 激活。例如,假设名为 my_rtn 的用户定义过程在其语句块中包含以下 SELECT 语句:

SELECT col1 FROM tab1;

限制假设以下语句调用 my_rtn 过程:

EXECUTE PROCEDURE my_rtn();

当语句块中的 SELECT 语句被执行时,该语句激活表 tab1 的列 col1 上定义的 Select 触发器。

选择列表中的子查询

Select 触发器可以被 SELECT 语句的 Projection 子句的选择列表中出现的子查询激活。

例如,如果 Select 触发器在 tab1 的 col1 上定义,则以下 SELECT 语句中的子查询激活该触发器:

SELECT (SELECT col1 FROM tab1 WHERE col1=1), colx, col y FROM tabz;

SELECT 的 FROM 子句中的子查询 

SELECT 的 FROM 子句中的表表达式可以是被不相关子查询引用的表上的触发事件。在以下示例中,指定一个表表达式的子查询是定义在 tab1 的 col1 上的 Select 触发器的触发事件:

SELECT vcol FROM (SELECT FIRST 5 col1 FROM tab1 ORDER BY col1 ) vtab(vcol);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值