# 40.1.事件触发行为概述
每当与之关联的事件发生在定义它的数据库中时,就会触发事件触发器。目前,唯一受支持的事件是ddl_命令_启动
,ddl_命令_结束
,表_重写
和sql_drop
。在未来的版本中可能会添加对其他事件的支持。
这个ddl_命令_启动
事件发生在执行创造
,改变
,滴
,安全标签
,议论
,授予
或撤销
命令在触发事件触发器之前,不会执行受影响对象是否存在的检查。但是,作为例外,针对共享对象(数据库、角色和表空间)的DDL命令或针对事件触发器本身的命令不会发生此事件。事件触发器机制不支持这些对象类型。ddl_命令_启动
也发生在执行命令之前选择进入
命令,因为这相当于将表创建为
.
这个ddl_命令_结束
事件发生在执行同一组命令之后。要获取发生的DDL操作的更多详细信息,请使用set returning函数pg_事件_触发器_ddl_命令()
从ddl_命令_结束
事件触发代码(参见第9.29节)。请注意,触发器在操作发生后(但在事务提交之前)触发,因此系统目录可以被读取为已更改。
这个sql_drop
事件发生在ddl_命令_结束
任何删除数据库对象的操作的事件触发器。要列出已删除的对象,请使用“设置返回”功能pg_事件_触发器_丢弃的_对象()
从sql_drop
事件触发代码(参见第9.29节)。请注意,触发器是在从系统目录中删除对象后执行的,因此无法再查找它们。
这个表_重写
事件发生在命令的某些操作重写表之前改变桌子
和改变类型
。而其他控制语句可用于重写表,如簇
和真空
这个表_重写
事件不是由它们触发的。
事件触发器(与其他函数一样)不能在中止的事务中执行。因此,如果DDL命令失败并出现错误,则ddl_命令_结束
触发器将不会被执行。相反,如果ddl_命令_启动
触发器失败并出现错误,不会触发进一步的事件触发器,也不会尝试执行命令本身。同样,如果ddl_命令_结束
触发器失败并出现错误时,DDL语句的效果将回滚,就像在包含事务的任何其他情况下一样。
有关事件触发器机制支持的命令的完整列表,请参阅第40.2节.
事件触发器是使用命令创建的创建事件触发器.要创建事件触发器,必须首先创建具有特殊返回类型的函数事件触发
.此函数不需要(也可能不需要)返回值;返回类型仅作为函数将作为事件触发器调用的信号。
如果为特定事件定义了多个事件触发器,它们将按触发器名称的字母顺序触发。
触发器定义还可以指定什么时候
条件,例如ddl_命令_启动
只有用户希望拦截的特定命令才能触发触发器。此类触发器的一个常见用途是限制用户可以执行的DDL操作的范围。