ITPub博客

首页 > 数据库 > 国内数据库 > GBase 8s SELECT 触发器介绍

GBase 8s SELECT 触发器介绍

原创 国内数据库 作者:Ln886 时间:2021-11-23 10:13:32 0 删除 编辑

SELECT 和 UPDATE 事件支持可选的 column 列表,如果您在同一个表上定义多个 SELECT 触发器,则每个触发器的 column 列表可以是唯一的或者是另一个 SELECT 触发器的重复。

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

·SELECT 语句引用 column 列表中的任何列。

·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'));

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

·SELECT 语句是独立的 SELECT 语句。

·SELECT 语句在选择列表中调用 UDR 中发生。

·SELECT 语句是Projection 列表中的子查询。

·SELECT 语句是 FROM 子句中的子查询。

·SELECT 语句在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 调用的 UDR 中发生。

1、 独立 SELECT 语句

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

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

SELECT * FROM tab1;

SELECT col1 FROM tab1;

2、 选择列表中的 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 触发器。

3、 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 触发器。

4、 选择列表中的子查询

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

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

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

5、 SELECT 的 FROM 子句中的子查询

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

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

6、 DELETE 或 UPDATE 的 WHERE 子句中的子查询

用 DELETE 语句 或 UPDATE 语句的 WHERE 子句中的子查询语法使用 Condition 的子查询不能是 SELECT 触发器的触发事件。在以下示例中,该子查询不是定义在 tab1 的 col2 上的 SELECT 触发器的触发事件:

DELETE tab1 WHERE EXISTS

(SELECT col2 FROM tab1 WHERE col2 > 1024);

但是,在同一示例的 DELETE 操作,激活定义在 tab1 上的 Delete 触发器。tbl1 上的 SELECT 触发器不会被通过修改子查询的 FORM 子句中引用的表的 DELETE 语句中的子查询激活。

类似地,以下语句中的 WHERE 子句的子查询不是定义在 tab1 的 col3 上的 SELECT 触发器的触发事件:

UPDATE tab1 SET col3 = col3 + 10

WHERE col3 > ANY

(SELECT col3 from tab1 WHERE col3 > 1);

相同的示例会激活定义在 tbl 的 col3 上的 Update 触发器,但是此子查询不会更改 SELECT 触发器。

7、 SELECT 触发器未激活时的情况

在某些情况下,触发表上的 SELECT 语句不激活 SELECT 触发器:

·如果包含 SELECT 语句的子查询或 UDR 出现在除 FROM 子句或 Projection 子句的 SELECT 语句的其它任意子句中,则 SELECT 触发器不被激活。

·例如,如果子查询或 UDR 出现在 SELECT 语句的 WHERE 子句或 HAVING 子句中,则子查询或 UDR 中的 SELECT 语句不激活 SELECT 触发器。

·如果 SELECT 触发器的触发操作调用包含触发 SELECT 语句的 UDR ,则 UDR 中 SELECT 上的 SELECT 触发器不被激活。不支持级联选择触发器。

·如果 SELECT 语句在其 Projection 子句中包含内置聚集或用户定义的聚集,则SELECT 触发器不被激活。例如,以下 SELECT 语句不会激活 tab1 的 col1 上定义的 SELECT 触发器:

SELECT MIN(col1) FROM tab1;

·包含集合运算符(包括 INTERSECT 、MINUS 、EXCEPT 、UNION 或 UNION ALL)的 SELECT 语句不会激活 SELECT 触发器。

·INSERT 的 SELECT 子句不激活 SELECT 触发器。

·DELETE 或 UPDATEA 语句的 WHERE 子句中的子查询不会激活 DELETE 或 UPDATE 语句正在更新的同一表上的 SELECT 触发器。

·如果 SELECT 的 Projection 子句包含 DISTINCT 或 UNIQUE 关键字,则 SELECT 语句不会激活 SELECT 触发器。

·滚动游标上不支持 SELECT 触发器。

·如果 SELECT 语句引用远程触发表,则 SELECT 触发器在远程数据库服务器上不被激活。

·查询的 ORDER BY 列表中的列不激活 SELECT 触发器(也不激活任何其它触发器),除非它们也列在 Projection 子句中。

最后一条限制的例外是 SELECT 触发器可以被 FROM 子句的子查询列表中的 ORDER BY 列表中的列激活,无论该相同的列是否出现在 Projection 子句中。在以下示例中,在 ORDER BY 子句中包含 col1 的表表达式(而不是在 Projection 子句中的选择列表的表表达式)是 tab1 的 col1 上定义的 SELECT 触发器的触发事件:

SELECT vcol FROM (SELECT col2 FROM tab1 ORDER BY col1 ) vtab(vcol);


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69997088/viewspace-2843578/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2021-03-24

  • 博文量
    4
  • 访问量
    3885