本節描述事件觸發函式介面的底層細節。只有在用 C 語言撰寫事件觸發函式時才需要此資訊。如果您使用較高階的語言,這些細節會自動處理。在大多數情況下,您應該考慮在使用 C 語言撰寫事件觸發器之前,先使用程序語言。每種程序語言的文件都會說明如何用該語言撰寫事件觸發器。
事件觸發函式必須使用 “版本 1” 函式管理員介面。
當函式由事件觸發管理員呼叫時,它不會傳遞任何一般的引數,但會傳遞一個指向 EventTriggerData
結構的 “context” 指標。C 函式可以透過執行巨集來檢查它們是否從事件觸發管理員呼叫:
CALLED_AS_EVENT_TRIGGER(fcinfo)
這會展開為:
((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))
如果這傳回 true,則可以安全地將 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)。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 回報文件問題。