# 9.29.事件触发函数

9.29.1. 在命令端捕获更改

9.29.2. 处理DDL命令丢弃的对象

9.29.3. 处理表重写事件

PostgreSQL提供了这些帮助函数来从事件触发器中检索信息。

有关事件触发器的更多信息,请参阅第40章.

# 9.29.1.在命令端捕获更改

pg_event_trigger_ddl_commands () → setof record

pg_事件_触发器_ddl_命令返回每个用户操作执行的DDL命令列表,当在附加到ddl_命令_结束事件触发器。如果在任何其他上下文中调用,则会引发错误。pg_事件_触发器_ddl_命令为执行的每个基本命令返回一行;某些单SQL语句的命令可能返回多行。此函数返回以下列:

名称 类型 描述
识别符 老年人 对象所属目录的OID
对象 老年人 对象本身的OID
奥布苏比德 整数 子对象ID(例如,列的属性号)
命令标签 文本 命令标签
对象类型 文本 对象的类型
模式名称 文本 对象所属架构的名称(如果有);否则无效的.不引用。
对象标识 文本 对象标识的文本呈现,符合架构要求。如有必要,将引用标识中包含的每个标识符。
in_扩展 布尔值 如果该命令是扩展脚本的一部分,则为True
命令 pg_ddl_命令 命令的完整表示形式,内部格式。这不能直接输出,但可以传递给其他函数,以获取有关该命令的不同信息。

# 9.29.2.处理DDL命令丢弃的对象

pg_event_trigger_dropped_objects () → setof record

pg_事件_触发器_掉落的_对象返回命令在其中删除的所有对象的列表sql_drop这就是所谓的事件。如果在任何其他上下文中调用,则会引发错误。此函数返回以下列:

名称 类型 描述
识别符 老年人 对象所属目录的OID
对象 老年人 对象本身的OID
奥布苏比德 整数 子对象ID(例如,列的属性号)
起初的 布尔值 如果这是删除的根对象之一,则为True
典型的 布尔值 如果指向此对象的依赖关系图中存在正常的依赖关系,则为True
你是临时的吗 布尔值 如果这是临时对象,则为True
对象类型 文本 对象的类型
模式名称 文本 对象所属架构的名称(如果有);否则无效的.不引用。
对象名称 文本 如果模式和名称的组合可用作对象的唯一标识符,则为对象的名称;否则无效的.不使用引号,且名称永远不会限定为架构。
对象标识 文本 对象标识的文本呈现,符合架构要求。如有必要,将引用标识中包含的每个标识符。
地址和姓名 文本[] 一个数组对象类型地址,可供pg_获取_对象_地址函数在包含同名对象的远程服务器中重新创建对象地址。
地址 文本[] 补充地址和姓名

这个pg_事件_触发器_掉落的_对象函数可用于以下事件触发器:

CREATE FUNCTION test_event_trigger_for_drops()
        RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
    LOOP
        RAISE NOTICE '% dropped object: % %.% %',
                     tg_tag,
                     obj.object_type,
                     obj.schema_name,
                     obj.object_name,
                     obj.object_identity;
    END LOOP;
END;
$$;
CREATE EVENT TRIGGER test_event_trigger_for_drops
   ON sql_drop
   EXECUTE FUNCTION test_event_trigger_for_drops();

# 9.29.3.处理表重写事件

中显示的功能表9.100提供有关表的信息,其中表_重写活动刚刚开始。如果在任何其他上下文中调用,则会引发错误。

表9.100.表重写信息函数

作用

描述
pg_事件_触发器_表_重写_oid () → 老年人

返回要重写的表的OID。
pg_事件_触发器_表_重写_原因 () → 整数

返回解释重写原因的代码。代码的确切含义取决于版本。

这些函数可用于以下事件触发器:

CREATE FUNCTION test_event_trigger_table_rewrite_oid()
 RETURNS event_trigger
 LANGUAGE plpgsql AS
$$
BEGIN
  RAISE NOTICE 'rewriting table % for reason %',
                pg_event_trigger_table_rewrite_oid()::regclass,
                pg_event_trigger_table_rewrite_reason();
END;
$$;

CREATE EVENT TRIGGER test_table_rewrite_oid
                  ON table_rewrite
   EXECUTE FUNCTION test_event_trigger_table_rewrite_oid();