SELECT 事件
DELETE 和 INSERT 事件由那些关键字(和 ON table 子句),但是 SELECT 和 UPDATE 事件还支持可选的 column 列表。
SELECT 事件
元素 | 描述 | 限制 | 语法 |
column | 激活触发器的列 | 必须在触发 table 中存在 | 标识符 |
owner | table 的所有者 | 必须拥有 table | 所有者名称 |
table | 触发表的名称 | 必须在数据库中存在 | 标识符 |
如果您在同一个表上定义多个 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'));
您不能对视图上的 INSTEAD OF 触发器指定 SELECT 事件。
Select 触发器被激活时的情况
在这些情况中,在触发表上的查询激活 Select 触发器:
- SELECT 语句是独立的 SELECT 语句。
- SELECT 语句在选择列表中调用 UDR 中发生。
- SELECT 语句是 Projection 列表中的子查询。
- SELECT 语句是 FROM 子句中的子查询。
- SELECT 语句在 EXECUTE PROCEDURE 或 EXECUTE FUNCTION 调用的 UDR 中发生。
- 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);