W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
這里是一個用 C 編寫的事件觸發(fā)器函數(shù)的簡單例子(用過程語言編寫的觸發(fā)器 例子可以在過程語言的文檔中找到)。
函數(shù)noddl
在每一次被調(diào)用時拋出一個異常。 事件觸發(fā)器定義把該函數(shù)和 ddl_command_start
事件關(guān)聯(lián)在了一起。其效果就是所有 DDL 命令(除第 39.1 節(jié)中提到的例外)都 被阻止運行。
這是該觸發(fā)器函數(shù)的源代碼:
#include "postgres.h" #include "commands/event_trigger.h" PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(noddl); Datum noddl(PG_FUNCTION_ARGS) { EventTriggerData *trigdata; if (!CALLED_AS_EVENT_TRIGGER(fcinfo)) /* internal error */ elog(ERROR, "not fired by event trigger manager"); trigdata = (EventTriggerData *) fcinfo->context; ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("command \"%s\" denied", trigdata->tag))); PG_RETURN_NULL(); }
在編譯了源代碼(見第 37.10.5 節(jié))后, 聲明函數(shù)和觸發(fā)器:
CREATE FUNCTION noddl() RETURNS event_trigger AS 'noddl' LANGUAGE C; CREATE EVENT TRIGGER noddl ON ddl_command_start EXECUTE FUNCTION noddl();
現(xiàn)在你可以測試該觸發(fā)器的操作:
=# \dy List of event triggers Name | Event | Owner | Enabled | Function | Tags -------+-------------------+-------+---------+----------+------ noddl | ddl_command_start | dim | enabled | noddl | (1 row) =# CREATE TABLE foo(id serial); ERROR: command "CREATE TABLE" denied
在這種情況下,為了在需要時能運行某些 DDL 命令,你必須刪除該事件觸發(fā)器 或者禁用它。只在一個事務(wù)期間禁用該觸發(fā)器會比較方便:
BEGIN; ALTER EVENT TRIGGER noddl DISABLE; CREATE TABLE foo (id serial); ALTER EVENT TRIGGER noddl ENABLE; COMMIT;
(回憶一下,事件觸發(fā)器本身上的 DDL 命令不受事件觸發(fā)器影響)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: