Select 触发器
当 CREATE TRIGGER 语句将指定表上的任何查询定义为其触发事件(SELECT ON table或SELECT 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 触发器,表层次结构中的所有子表也会继承此触发器。
有关覆盖和禁用继承触发器的信息,请参阅表层次结构中的触发器。




