PostgreSQL 用 C 編寫事件觸發(fā)器函數(shù)

2021-09-03 16:07 更新

這一節(jié)描述了事件觸發(fā)器函數(shù)接口的低層細節(jié)。只有在用 C 編寫事件 觸發(fā)器函數(shù)時才需要用到這里的信息。如果使用更高層的語言,那么 這些細節(jié)已經被處理好了。在大部分情況下都應該優(yōu)先考慮使用過程 語言來編寫你的事件觸發(fā)器。每一種過程語言的文檔都解釋了如何用 它編寫事件觸發(fā)器。

事件觸發(fā)器函數(shù)必須使用版本 1的函數(shù)管理器接口。

當一個函數(shù)被事件觸發(fā)器管理器調用時,向它傳遞的并不是普通參數(shù), 而是一個指向EventTriggerData結構的 context指針。C 函數(shù)可以通過執(zhí)行以下宏來檢查它是否 被事件觸發(fā)器管理器調用:

CALLED_AS_EVENT_TRIGGER(fcinfo)

這個宏會被擴展為:

((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))

如果這個宏返回真,那么就可以安全地把 fcinfo->context造型為類型EventTriggerData *并且使用所指向的EventTriggerData結構。 函數(shù)不能修改 EventTriggerData結構以及它指向的任何內容。

struct EventTriggerDatacommands/event_trigger.h中定義:

typedef struct EventTriggerData
{
    NodeTag     type;
    const char *event;      /* 事件名稱 */
    Node       *parsetree;  /* 解析樹 */
    CommandTag  tag;        /* 命令標簽 */
} EventTriggerData;

其中的成員定義如下:

type

總是T_EventTriggerData。

event

描述要為其調用這個函數(shù)的事件,可以是 "ddl_command_start"、"ddl_command_end"、 "sql_drop"、"table_rewrite"之一。 這些事件的含義請見第 39.1 節(jié)

parsetree

該命令的解析樹的指針。其細節(jié)可以參考 PostgreSQL 的源代碼。 解析樹結構可能會在未經通知的情況下改變。

tag

與事件觸發(fā)器的事件相關聯(lián)的命令標簽,例如 "CREATE FUNCTION"

一個事件觸發(fā)器函數(shù)必須返回一個NULL指針( 不是一個 SQL 空值,也就是不要把 isNull設置為真)。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號