暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBASE数据库分享Select 触发器事件

三金先生 2023-07-25
122

Select 触发器

当 CREATE TRIGGER 语句将指定表上的任何查询定义为其触发事件(SELECT ON tableSELECT ON column-list ON table)时,生成的触发对象是指定表的 Select 触发器。同一触发器还可以被包含将此表作为其 基本表的触发列的视图上的查询激活。但是,SELECT 语句不能是视图上 INSTEAD OF 触 发器的触发事件。

如果 CREATE TRIGGER 语句在嵌入 Select 触发事件的定义中也包含列列表,并且指定 表上后续查询的投影列表不包含任何指定的列,那么该查询不能是此 Select 触发器的触发 事件。

警告:

Select 触发器不建议用于审计。不要出于执行应用程序指定审计的目的而在表或其列的子 集上尝试创建 Select 触发器。一般情况下,通过创建 Select 触发器来跟踪表上的 Select

动作的数量,以在每次用户查询某个表时将审计记录插入到审计表中是不可能的。

例如,假设您在表 AuditedTable 上定义了 Select 触发器,且对 AuditedTable 持有 Select 特 权的用户发出了以下查询:

SELECT a.* FROM (SELECT * FROM AuditedTable) AS a;

数据库服务器不发出错误,但是 AuditedTable 上的 SELECT 触发器不会被此查询激活。包 含集合运算符(例如 UNION 或 INTERSECT)的查询,或者其它 Select 触发器不支持的 语法,将会被基于 Select 触发器的审计记录策略无视。

因为执行 Select 触发器的大量的限制(部分在本章中列出),生成的 Select 触发操作通 常仅对应于试图枚举的任何逻辑 Select 事件的子集(它可能为空)。


 执行触发操作的 SELECT 语句

当创建 select 触发器时,仅某些类型的 SELECT 语句可以执行对该触发器定义的操作。

Select 触发器仅当下列类型的 SELECT 语句执行:

• 独立的 SELECT 语句t

• SELECT 语句的选择列表中的集合子查询

• 嵌入用户定义例程的 SELECT 语句

• 视图

独立 SELECT 语句

假设您对表定义了下面的 Select 触发器:

CREATE TRIGGER hits_trig SELECT OF col_a ON tab_a REFERENCING OLD AS hit FOR EACH ROW (INSERT INTO hits_log VALUES (hit.col_a, CURRENT, USER));

当触发列出现在独立 SELECT 语句的选择列表中时执行 Select 触发器。以下语句针对数 据库服务器返回的行的每个实例执行 hits_trig 触发器上的触发操作:

SELECT col_a FROM tab_a;

查询投影列表中的集合子查询

当触发列出现在位于其它 SELECT 语句的投影列表中的集合子查询中时,将执行 Select

触发器。以下语句针对集合子查询返回的行的每个实例执行hits_trig 触发器上的触发操作:

SELECT MULTISET(SELECT col_a FROM tab_a) FROM ...

嵌入在用户定义例程中的 SELECT 语句

对嵌入在用户定义的例程(UDR)中的 SELECT 语句定义的选择触发器仅在以下情况下执 行触发操作:

• UDR 出现在 SELECT 语句的选择列表中

• UDR 使用 EXECUTE PROCEDURE 语句调用

假设您创建包含语句 SELECT col_a FROM tab_a 的例程 new_proc。下面的每条语句针对嵌 入的 SELECT 语句所返回行的每一个实例执行 hits_trig触发器的触发操作:

SELECT new_proc() FROM tab_b; EXECUTE PROCEDURE new_proc;

视图

Select 触发器对其基础表包含触发列的引用的视图执行触发操作。但是,不能在视图上定 义 Select 触发器。

假设您创建了下列视图:

CREATE VIEW view_tab AS SELECT * FROM tab_a;

以下语句针对视图返回的行的每个实例执行 hits_trig 触发器上的触发操作:

SELECT * FROM view_tab;

SELECT col_a FROM tab_a;


执行 Select 触发器的限制

下列类型的 SELECT 语句不会触发 Select 触发器上的任何操作。

• 触发列不在投影列表中(例如,出现在 SELECT 语句的 WHERE 子句中的列不会 执行 Select 触发器)。

• 引用远程表的 SELECT 语句。

• SELECT 语句调用聚集函数或 OLAP 窗口聚集函数。

• SELECT 语句包含集合运算符或(UNION 、UNION ALL 、INTERSECT 、MINUS

或 EXCEPT)。

• SELECT 语句包含 DISTINCT 或 UNIQUE 关键字。

• 包含 SELECT 语句的 UDR 表达式不在投影列表中。

• SELECT 语句出现在 INSERT INTO 语句中。

• SELECT 语句出现在滚动游标中。

• 触发器是级联 Select 触发器。

级联 Select 触发器是其操作包含 SPL 例程的触发器,该例程本身具有触发 select

语句。但是,不执行级联 Select 触发器的操作,数据库服务器也不返回错误。


在表层次结构中的表的 Select 触发器

当您对超表定义 select 触发器,表层次结构中的所有子表也会继承此触发器。

有关覆盖和禁用继承触发器的信息,请参阅表层次结构中的触发器。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论