CREATE EVENT TRIGGER — 定义新的事件触发器
CREATE EVENT TRIGGERname
ONevent
[ WHENfilter_variable
IN (filter_value
[, ... ]) [ AND ... ] ] EXECUTE { FUNCTION | PROCEDURE }function_name
()
CREATE EVENT TRIGGER
会创建新的事件触发器。只要指定的事件发生,并且与触发器相关联的 WHEN
条件(如有)得到满足,触发器函数就会被执行。有关事件触发器的总体介绍,请参阅第 38 章。创建事件触发器的用户将成为该触发器的所有者。
名称
分配给新触发器的名称。此名称在数据库中必须是唯一的。
事件
触发被指定函数调用的事件的名称。有关事件名称的更多信息,请参阅第 38.1 节。
filter_variable
用于过滤事件的变量名称。这让用户可以将触发器的触发限制在一部分受支持的情况下。当前,唯一受支持的 filter_variable
是 TAG
。
filter_value
触发器触发的关联 filter_variable
的值列表。对于 TAG
,这意味着命令标签列表(例如,'DROP FUNCTION'
)。
function_name
用户提供的函数,声明为不带参数且返回类型 event_trigger
。
在 CREATE EVENT TRIGGER
的语法中,关键字 FUNCTION
和 PROCEDURE
是等效的,但在任何情况下引用的函数都必须是函数,而不是过程。此处的关键字 PROCEDURE
的使用具有历史意义且已弃用。
只有超级用户才能创建事件触发器。
事件触发器在单用户模式下(见 postgres)以及 event_triggers 设置为 false
时禁用。如果错误的事件触发器使数据库禁用,以至于您甚至无法删除触发器,则重新启动并设置 event_triggers 为 false
以临时禁用事件触发器或处于单用户模式,您便能够执行此操作。
禁止执行任何 DDL 命令
CREATE OR REPLACE FUNCTION abort_any_command() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'command % is disabled', tg_tag; END; $$; CREATE EVENT TRIGGER abort_ddl ON ddl_command_start EXECUTE FUNCTION abort_any_command();
SQL 标准中没有 CREATE EVENT TRIGGER
语句。