DDL 触发器的组成
一个 DDL 触发器由以下部分组成:
DDL 触发器的组成
触发事件:
ddl_command_start:在
CREATE
、ALTER
、DROP
、SECURITY LABEL
、COMMENT
、GRANT
或REVOKE
命令执行前触发。在 DDL 触发器引发前不会做受影响对象是否存在的检查。不过,一个例外是,这个事件不会被目标是共享对象数据库、角色以及表空间的 DDL命令触发,也不会被目标是 DDL 触发器的 DDL 命令触发。 DDL 触发器机制不支持这些对象类型。ddl_command_start 也会在
SELECT INTO
命令的执行之前触发,因为这等价于CREATE TABLE AS
。ddl_command_end:在
CREATE
、ALTER
、DROP
、SECURITY LABEL
、COMMENT
、GRANT
或REVOKE
命令执行后触发。为了得到发生的DDL操作的更多细节,可以从ddl_command_end DDL 触发器代码中使用集合返回函数
pg_event_trigger_ddl_comands()
。注意该触发器是在那些动作已经发生之后(但是在事务提交前)引发,并且因此系统目录会被读作已更改。sql_drop:为任何删除数据库对象的操作在 ddl_command_end DDL 触发器之前触发。
列出已经被删除的对象,可以从 sql_drop DDL 触发器代码中使用集合返回函数
pg_event_trigger_dropped_objects()
。注意该触发器是在对象已经从系统目录删除以后执行因此不能再查看它们。table_rewrite:在表被命令
ALTER TABLE
和ALTER TYPE
的某些动作重写之前触发。例如
CLUSTER
和VACUUM
也会重写表,但不会触发table_rewrite 事件。logon:用户登录后触发。
logoff:用户登出前触发。
STARTUP:启动数据库后触发。
SHUTDOW:停止数据库前触发。
触发类型:
ON:仅用于 ddl_command_start、ddl_command_end、sql_drop 与 table_rewrite 事件。
BEFORE:在事件发生前触发,仅支持
BEFORE LOGOFF
与BEFORE SHUTDOWN
。AFTER:在事件发生后触发,仅支持
AFTER LOGON
与AFTER STARTUP
。
触发动作:触发器执行的动作,通常会执行一个 PL/pgSQL 函数。
DDL 触发器的触发函数的返回类型为 event_trigger。
触发条件:
WHEN
子句指定的逻辑表达式为 TRUE 时遇到触发事件才会自动执行触发器,使其执行触发操作。LOGON 与 LOGOFF 事件不支持
WHEN
子句。