W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
只要與一個事件觸發(fā)器相關的事件在事件觸發(fā)器所在的數(shù)據(jù)庫中發(fā)生, 該事件觸發(fā)器就會被引發(fā)。當前支持的事件是 ddl_command_start
、ddl_command_end
、 table_rewrite
和sql_drop
。未來的發(fā)行版 中可能會增加對更多事件的支持。
ddl_command_start
事件就在CREATE
、 ALTER
、DROP
、SECURITY LABEL
、 COMMENT
、GRANT
或者
REVOKE
命令的執(zhí)行之前發(fā)生。在事件觸發(fā)器引發(fā)前不會做受影響對象是否存在的檢查。 不過,一個例外是,這個事件不會為目標是共享對象 — 數(shù)據(jù)庫、角色 以及表空間 — 的 DDL 命令發(fā)生,也不會為目標是事件觸發(fā)器的 DDL 命令發(fā)生。事件觸發(fā)器機制不支持這些對象類型。 ddl_command_start
也會在SELECT INTO
命令的執(zhí)行之前發(fā)生,因為這等價于
CREATE TABLE AS
。
ddl_command_end
事件就在同一組命令的執(zhí)行之后發(fā)生。為了 得到發(fā)生的DDL操作的更多細節(jié),可以從 ddl_command_end
事件觸發(fā)器代碼中使用集合返回函數(shù) pg_event_trigger_ddl_commands()
(見 第 9.29 節(jié))。注意該觸發(fā)器是在那些動作 已經(jīng)發(fā)生之后(但是在事務提交前)引發(fā),并且因此系統(tǒng)目錄會被讀作已更改。
sql_drop
事件為任何刪除數(shù)據(jù)庫對象的操作在 ddl_command_end
事件觸發(fā)器之前發(fā)生。要列出已經(jīng)被刪除的 對象,可以從sql_drop
事件觸發(fā)器代碼中使用集合返回函數(shù) pg_event_trigger_dropped_objects()
見 第 9.29 節(jié))。注意該觸發(fā)器是在對象已經(jīng) 從系統(tǒng)目錄刪除以后執(zhí)行,因此不能再查看它們。
table_rewrite
事件在表被命令ALTER TABLE
和 ALTER TYPE
的某些動作重寫之前發(fā)生。雖然其他控制語句(例如 CLUSTER
和VACUUM
)也可以用來重 寫表,但是它們不會觸發(fā)table_rewrite
事件。
不能在一個中止的事務中執(zhí)行事件觸發(fā)器(其他函數(shù)也一樣)。因此,如果一個 DDL 命令出現(xiàn)錯誤失敗,將不會執(zhí)行任何相關的 ddl_command_end
觸發(fā)器。反過來,如果一個 ddl_command_start
觸發(fā)器出現(xiàn)錯誤失敗,將不會引發(fā)進一步的 事件觸發(fā)器,并且不會嘗試執(zhí)行該命令本身。類似地,如果一個 ddl_command_end
觸發(fā)器出現(xiàn)錯誤失敗,DDL
命令的效果將被 回滾,就像其他包含事務中止的情況中那樣。
第 39.2 節(jié)中有事件觸發(fā)器機制所支持的完整 命令列表。
事件觸發(fā)器通過命令CREATE EVENT TRIGGER創(chuàng)建。為了 創(chuàng)建一個事件觸發(fā)器,你必須首先創(chuàng)建一個有特殊返回類型 event_trigger
的函數(shù)。這個函數(shù)不一定需要返回一個值, 該返回類型僅僅是作為一種信號表示該函數(shù)要被作為一個事件觸發(fā)器調(diào)用。
如果對于一個特定的事件定義了多于一個事件觸發(fā)器,它們將按照觸發(fā)器名稱 的字母表順序被引發(fā)。
一個觸發(fā)器定義也可以指定一個WHEN
條件,這樣事件觸 發(fā)器(例如ddl_command_start
觸發(fā)器)就可以只對用戶 希望介入的特定命令觸發(fā)。這類觸發(fā)器的通常用法是用于限制用戶可能執(zhí)行的 DDL 操作的范圍。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: