问题报告 纠错本页面

37.1. 事件触发器行为的概述

当事件以它定义的方式在数据库中相关的出现时,事件触发器触发。当前支持的事件是 ddl_command_start, ddl_command_endsql_drop。 额外事件的支持将在将来的版本中添加。

ddl_command_start事件只在CREATE, ALTER, 或 DROP 命令执行之前发生。在事件触发器触发之前并不检查受影响的对象是否存在。然而,作为一个例外, DDL命令针对共享对象时这个事件并不触发 — 数据库,角色和表空间 — 或命令针对事件触发器它们自己时也不触发。 事件触发器机制不支持这些对象类型。ddl_command_start也在SELECT INTO 命令执行之前触发,因为这相当于CREATE TABLE AS

ddl_command_end事件只在相同的命令集的执行之后触发。

sql_drop事件只在删除数据库对象的任意操作触发ddl_command_end事件之前发生。 要列出被删除的对象,使用sql_drop事件触发器代码的设置返回函数 pg_event_trigger_dropped_objects()(参阅第 9.28 节)。 请注意,触发器在对象已经从系统目录中删除以后执行,所以不可能在看到他们了。

事件触发器(类似其他函数)不能在一个中止的事务中执行。因此, 如果一个DDL命令错误失败,相关的ddl_command_end触发器将不会执行。 相反的,如果一个ddl_command_start触发器错误失败了,将不会有更多的触发器触发, 也不会尝试执行命令本身。相似的,如果一个ddl_command_end触发器错误失败了, DDL语句的影响将会回滚,就像他们在任何其他包含事务中止的情况下一样。

事件触发器机制支持的命令的完整列表,请参阅第 37.2 节

使用命令CREATE EVENT TRIGGER创建事件触发器。为了创建事件触发器, 必须首先创建一个特殊返回类型为event_trigger的函数。 这个函数不需要(或不可能)返回一个值;返回类型只是作为一个该函数被作为一个事件触发器调用的信号服务的。

如果为一个特别事件定义了多个事件触发器,他们将按照触发器名字的字母顺序触发。

触发器定义也可以声明一个WHEN条件,例如,一个ddl_command_start 触发器可以只为用户想要拦截的特别的命令触发。这样的触发器共同使用的是限制用户可能执行的DDL操作的范围。