GBase 8s SELECT 觸發器介紹

Ln886發表於2021-11-23

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部落格 ” ,連結:http://blog.itpub.net/69997088/viewspace-2843578/,如需轉載,請註明出處,否則將追究法律責任。

相關文章