GBase 8s SELECT 觸發器介紹
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL觸發器介紹MySql觸發器
- GBase 8s 安裝
- Gbase 8s 動態 SQLSQL
- GBase 8s系統函式函式
- jQuery select 觸發事件jQuery事件
- MySQL觸發器的使用和優缺點介紹ZGMHMySql觸發器
- GBase8s優化指令介紹優化
- GBase8d中ldif的介紹
- GBase8s資料型別介紹資料型別
- GBase 8s資料庫初體驗-01安裝資料庫
- Quartz入門及觸發器與Trigger的介紹&&Spring task Vs Quartz的比較quartz觸發器Spring
- 008 Rust 非同步程式設計,select 宏介紹Rust非同步程式設計
- 008 Rust 非同步程式設計,select 巨集介紹Rust非同步程式設計
- 南大通用GBase 8s資料庫的約束查詢資料庫
- 南大通用GBase 8s 共享記憶體結構概覽記憶體
- mysql觸發器MySql觸發器
- D觸發器觸發器
- 簡單介紹Angular單元測試之事件觸發的實現Angular事件
- 查詢GBase XDM Cluster的客戶端示例程式介紹客戶端
- 水面蒸發感測器產品介紹
- python描述器介紹Python
- 一個IT人的自卷之路 —— GBase 8s培訓學習總結
- 南大通用GBase 8s與新華三Superdome Flex完成相容互認Flex
- 乾貨分享 GBase 8s使用者與許可權管理揭祕
- 函式計算非同步任務能力介紹 - 任務觸發去重函式非同步
- 【 GBASE的那些事兒】系列直播活動第02期《GBase 8s高可用技術及案例分析法》
- 【Kotlin】select簡介Kotlin
- SqlServer-觸發器SQLServer觸發器
- logon觸發器for dbaGo觸發器
- MySQL使用觸發器MySql觸發器
- 語句觸發器觸發器
- MySql-觸發器MySql觸發器
- sqlserver 列觸發器SQLServer觸發器
- 除錯觸發器除錯觸發器
- 建立MySQL觸發器MySql觸發器
- 延遲塊清理介紹(select也會產生redo的原因)
- 伺服器的介紹伺服器
- DNS伺服器介紹DNS伺服器