本節描述了事件觸發器函式的介面的底層細節。這些資訊僅在用 C 語言編寫事件觸發器函式時才需要。如果您使用的是更高階的語言,那麼這些細節將由語言為您處理。在大多數情況下,您應該考慮使用過程語言,然後再用 C 語言編寫事件觸發器。每種過程語言的文件都解釋瞭如何用該語言編寫事件觸發器。
事件觸發器函式必須使用“version 1”函式管理器介面。
當函式被事件觸發器管理器呼叫時,它不會接收任何常規引數,而是接收一個指向 EventTriggerData
結構的“context”指標。C 函式可以透過執行以下宏來檢查它們是否被事件觸發器管理器呼叫:
CALLED_AS_EVENT_TRIGGER(fcinfo)
展開為
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果此值為真,則可以將 fcinfo->context
安全地轉換為 EventTriggerData *
型別,並使用指向的 EventTriggerData
結構。該函式不得更改 EventTriggerData
結構或其指向的任何資料。
struct EventTriggerData
定義在 commands/event_trigger.h
中
typedef struct EventTriggerData { NodeTag type; const char *event; /* event name */ Node *parsetree; /* parse tree */ CommandTag tag; /* command tag */ } EventTriggerData;
成員定義如下:
type
始終為 T_EventTriggerData
。
event
描述呼叫函式的事件,這些事件包括 "login"
、"ddl_command_start"
、"ddl_command_end"
、"sql_drop"
、"table_rewrite"
。有關這些事件的含義,請參閱 第 38.1 節。
parsetree
指向命令的解析樹的指標。有關詳細資訊,請檢查 PostgreSQL 原始碼。解析樹結構可能會在不通知的情況下更改。
tag
與事件觸發器執行的事件相關的命令標籤,例如 "CREATE FUNCTION"
。
事件觸發器函式必須返回一個 NULL
指標(不是 SQL 的 null 值,即不要將 isNull
設定為 true)。
如果您在文件中發現任何不正確的內容、與您對特定功能的實際體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。