當事件觸發器關聯的事件在它被定義的資料庫中發生時,事件觸發器就會被觸發。當前支援的事件有 login
、ddl_command_start
、ddl_command_end
、table_rewrite
和 sql_drop
。未來版本可能會新增對其他事件的支援。
當一個已認證的使用者登入系統時,會發生 login
事件。此事件的觸發器過程中任何錯誤都可能阻止使用者成功登入系統。此類錯誤可以透過在連線字串或配置檔案中將 event_triggers 設定為 false
來規避。或者,您可以以單使用者模式重啟系統(因為事件觸發器在此模式下是停用的)。有關使用單使用者模式的詳細資訊,請參閱 postgres 參考頁。 login
事件在備用伺服器上也會觸發。為防止伺服器變得不可訪問,此類觸發器在備用伺服器上執行時必須避免向資料庫寫入任何內容。另外,建議避免在 login
事件觸發器中執行耗時查詢。請注意,例如,在 psql 中取消連線不會取消正在進行的 login
觸發器。
有關如何使用 login
事件觸發器的示例,請參閱 第 38.5 節。
在 DDL 命令執行之前,會發生 ddl_command_start
事件。在此上下文中,DDL 命令包括:
CREATE
ALTER
DROP
COMMENT
GRANT
IMPORT FOREIGN SCHEMA
REINDEX
REFRESH MATERIALIZED VIEW
REVOKE
SECURITY LABEL
在執行 SELECT INTO
命令之前,也會發生 ddl_command_start
,因為這等同於 CREATE TABLE AS
。
例外情況是,此事件不會針對以下共享物件的 DDL 命令觸發:
databases
roles (role definitions and role memberships)
tablespaces
parameter privileges
ALTER SYSTEM
此事件也不會針對事件觸發器本身的命令觸發。
在事件觸發器觸發之前,不會執行檢查以確定受影響的物件是否存在。
在執行與 ddl_command_start
相同的命令集之後,會發生 ddl_command_end
事件。要獲取有關DDL已執行的操作的更多詳細資訊,請使用 ddl_command_end
事件觸發器程式碼中的集合返回函式 pg_event_trigger_ddl_commands()
(請參閱 第 9.30 節)。請注意,觸發器在操作已執行後(但在事務提交前)觸發,因此可以讀取已經更改的系統目錄。
對於任何刪除資料庫物件的 DDL 操作,在 ddl_command_end
事件觸發器之前,會發生 sql_drop
事件。請注意,除了顯而易見的 DROP
命令之外,一些 ALTER
命令也可能觸發 sql_drop
事件。
要列出已被刪除的物件,請使用 sql_drop
事件觸發器程式碼中的集合返回函式 pg_event_trigger_dropped_objects()
(請參閱 第 9.30 節)。請注意,觸發器在物件已從系統目錄中刪除後執行,因此無法再查詢它們。
在執行 ALTER TABLE
和 ALTER TYPE
命令的某些操作重寫表之前,會發生 table_rewrite
事件。雖然有其他控制語句可用於重寫表,例如 CLUSTER
和 VACUUM
,但 table_rewrite
事件不會由它們觸發。要查詢被重寫的表的 OID,請使用函式 pg_event_trigger_table_rewrite_oid()
;要發現重寫的原因,請使用函式 pg_event_trigger_table_rewrite_reason()
(請參閱 第 9.30 節)。
事件觸發器(與其他函式一樣)不能在已廢棄的事務中執行。因此,如果 DDL 命令因錯誤而失敗,任何關聯的 ddl_command_end
觸發器都不會被執行。反之,如果 ddl_command_start
觸發器因錯誤而失敗,將不會觸發任何其他事件觸發器,也不會嘗試執行命令本身。同樣,如果 ddl_command_end
觸發器因錯誤而失敗,DDL 語句的效果將回滾,就像在任何其他包含事務被廢棄的情況下一樣。
使用命令 CREATE EVENT TRIGGER 建立事件觸發器。要建立事件觸發器,您必須首先建立一個返回型別為 event_trigger
的函式。此函式不需要(也不能)返回值;返回型別僅用作訊號,表明該函式將被呼叫為事件觸發器。
如果為特定事件定義了多個事件觸發器,它們將按觸發器名稱的字母順序觸發。
觸發器定義還可以指定一個 WHEN
條件,以便例如,ddl_command_start
觸發器僅針對使用者希望攔截的特定命令觸發。此類觸發器的一個常見用途是限制使用者可以執行的 DDL 操作的範圍。
如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表格 報告文件問題。