支援的版本:目前版本 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3

38.3. 用 C 語言撰寫事件觸發函式 #

本節描述事件觸發函式介面的底層細節。只有在用 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 EventTriggerDatacommands/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)。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 回報文件問題。