CREATE EVENT TRIGGER — 定义一个新的事件触发器
CREATE EVENT TRIGGERnameONevent[ WHENfilter_variableIN (filter_value[, ... ]) [ AND ... ] ] EXECUTE { FUNCTION | PROCEDURE }function_name()
CREATE EVENT TRIGGER 创建一个新的事件触发器。只要指定的事件发生,并且与该触发器相关联的 WHEN 条件(如果有的话)得到满足,触发器函数就会被执行。有关事件触发器的一般性介绍,请参见 Chapter 38。创建事件触发器的用户将成为它的拥有者。
name要赋予新触发器的名称。该名称在数据库中必须唯一。
event将触发对给定函数的调用的事件的名称。有关事件名称的更多信息,请参见 Section 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 语句。