2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

38.1. 事件觸發器行為概述 #

當事件觸發器關聯的事件在它被定義的資料庫中發生時,事件觸發器就會被觸發。當前支援的事件有 loginddl_command_startddl_command_endtable_rewritesql_drop。未來版本可能會新增對其他事件的支援。

38.1.1. login #

當一個已認證的使用者登入系統時,會發生 login 事件。此事件的觸發器過程中任何錯誤都可能阻止使用者成功登入系統。此類錯誤可以透過在連線字串或配置檔案中將 event_triggers 設定為 false 來規避。或者,您可以以單使用者模式重啟系統(因為事件觸發器在此模式下是停用的)。有關使用單使用者模式的詳細資訊,請參閱 postgres 參考頁。 login 事件在備用伺服器上也會觸發。為防止伺服器變得不可訪問,此類觸發器在備用伺服器上執行時必須避免向資料庫寫入任何內容。另外,建議避免在 login 事件觸發器中執行耗時查詢。請注意,例如,在 psql 中取消連線不會取消正在進行的 login 觸發器。

有關如何使用 login 事件觸發器的示例,請參閱 第 38.5 節

38.1.2. ddl_command_start #

在 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

此事件也不會針對事件觸發器本身的命令觸發。

在事件觸發器觸發之前,不會執行檢查以確定受影響的物件是否存在。

38.1.3. ddl_command_end #

在執行與 ddl_command_start 相同的命令集之後,會發生 ddl_command_end 事件。要獲取有關DDL已執行的操作的更多詳細資訊,請使用 ddl_command_end 事件觸發器程式碼中的集合返回函式 pg_event_trigger_ddl_commands()(請參閱 第 9.30 節)。請注意,觸發器在操作已執行後(但在事務提交前)觸發,因此可以讀取已經更改的系統目錄。

38.1.4. sql_drop #

對於任何刪除資料庫物件的 DDL 操作,在 ddl_command_end 事件觸發器之前,會發生 sql_drop 事件。請注意,除了顯而易見的 DROP 命令之外,一些 ALTER 命令也可能觸發 sql_drop 事件。

要列出已被刪除的物件,請使用 sql_drop 事件觸發器程式碼中的集合返回函式 pg_event_trigger_dropped_objects()(請參閱 第 9.30 節)。請注意,觸發器在物件已從系統目錄中刪除後執行,因此無法再查詢它們。

38.1.5. table_rewrite #

在執行 ALTER TABLEALTER TYPE 命令的某些操作重寫表之前,會發生 table_rewrite 事件。雖然有其他控制語句可用於重寫表,例如 CLUSTERVACUUM,但 table_rewrite 事件不會由它們觸發。要查詢被重寫的表的 OID,請使用函式 pg_event_trigger_table_rewrite_oid();要發現重寫的原因,請使用函式 pg_event_trigger_table_rewrite_reason()(請參閱 第 9.30 節)。

38.1.6. 廢棄事務中的事件觸發器 #

事件觸發器(與其他函式一樣)不能在已廢棄的事務中執行。因此,如果 DDL 命令因錯誤而失敗,任何關聯的 ddl_command_end 觸發器都不會被執行。反之,如果 ddl_command_start 觸發器因錯誤而失敗,將不會觸發任何其他事件觸發器,也不會嘗試執行命令本身。同樣,如果 ddl_command_end 觸發器因錯誤而失敗,DDL 語句的效果將回滾,就像在任何其他包含事務被廢棄的情況下一樣。

38.1.7. 建立事件觸發器 #

使用命令 CREATE EVENT TRIGGER 建立事件觸發器。要建立事件觸發器,您必須首先建立一個返回型別為 event_trigger 的函式。此函式不需要(也不能)返回值;返回型別僅用作訊號,表明該函式將被呼叫為事件觸發器。

如果為特定事件定義了多個事件觸發器,它們將按觸發器名稱的字母順序觸發。

觸發器定義還可以指定一個 WHEN 條件,以便例如,ddl_command_start 觸發器僅針對使用者希望攔截的特定命令觸發。此類觸發器的一個常見用途是限制使用者可以執行的 DDL 操作的範圍。

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表格 報告文件問題。