多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 37.1\. 事件触发器行为的概述 当事件以它定义的方式在数据库中相关的出现时,事件触发器触发。当前支持的事件是 `ddl_command_start`, `ddl_command_end` 和 `sql_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()`(参阅[Section 9.28](#calibre_link-448))。 请注意,触发器在对象已经从系统目录中删除以后执行,所以不可能在看到他们了。 事件触发器(类似其他函数)不能在一个中止的事务中执行。因此, 如果一个DDL命令错误失败,相关的`ddl_command_end`触发器将不会执行。 相反的,如果一个`ddl_command_start`触发器错误失败了,将不会有更多的触发器触发, 也不会尝试执行命令本身。相似的,如果一个`ddl_command_end`触发器错误失败了, DDL语句的影响将会回滚,就像他们在任何其他包含事务中止的情况下一样。 事件触发器机制支持的命令的完整列表,请参阅[Section 37.2](#calibre_link-846)。 使用命令[CREATE EVENT TRIGGER](#calibre_link-574)创建事件触发器。为了创建事件触发器, 必须首先创建一个特殊返回类型为`event_trigger`的函数。 这个函数不需要(或不可能)返回一个值;返回类型只是作为一个该函数被作为一个事件触发器调用的信号服务的。 如果为一个特别事件定义了多个事件触发器,他们将按照触发器名字的字母顺序触发。 触发器定义也可以声明一个`WHEN`条件,例如,一个`ddl_command_start` 触发器可以只为用户想要拦截的特别的命令触发。这样的触发器共同使用的是限制用户可能执行的DDL操作的范围。