VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DDL 触发器的组成

一个 DDL 触发器由以下部分组成:

DDL 触发器的组成

  • 触发事件

    • ddl_command_start:在 CREATEALTERDROPSECURITY LABELCOMMENTGRANTREVOKE 命令执行前触发。

      在 DDL 触发器引发前不会做受影响对象是否存在的检查。不过,一个例外是,这个事件不会被目标是共享对象数据库、角色以及表空间的 DDL命令触发,也不会被目标是 DDL 触发器的 DDL 命令触发。 DDL 触发器机制不支持这些对象类型。ddl_command_start 也会在 SELECT INTO 命令的执行之前触发,因为这等价于 CREATE TABLE AS

    • ddl_command_end:在 CREATEALTERDROPSECURITY LABELCOMMENTGRANTREVOKE 命令执行后触发。

      为了得到发生的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 TABLEALTER TYPE 的某些动作重写之前触发。

      例如 CLUSTERVACUUM 也会重写表,但不会触发table_rewrite 事件。

    • logon:用户登录后触发。

    • logoff:用户登出前触发。

    • STARTUP:启动数据库后触发。

    • SHUTDOW:停止数据库前触发。

  • 触发类型

    • ON:仅用于 ddl_command_start、ddl_command_end、sql_drop 与 table_rewrite 事件。

    • BEFORE:在事件发生前触发,仅支持 BEFORE LOGOFFBEFORE SHUTDOWN

    • AFTER:在事件发生后触发,仅支持 AFTER LOGONAFTER STARTUP

  • 触发动作:触发器执行的动作,通常会执行一个 PL/pgSQL 函数。

    DDL 触发器的触发函数的返回类型为 event_trigger。

  • 触发条件WHEN 子句指定的逻辑表达式为 TRUE 时遇到触发事件才会自动执行触发器,使其执行触发操作。

    LOGON 与 LOGOFF 事件不支持 WHEN 子句。