Redrock Postgres 文档
主页 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页
编辑页面

事件触发器捕获的 DDL 事件能感知到模式搜索路径的变化吗?

问题解答

事件触发器对一个特定数据库来说是全局的,并且可以捕获该数据库中发生的 DDL 事件。Redrock Postgres 提供了函数 pg_ddl_command_deparse,可以将 DDL 命令从pg_ddl_command类型的内部格式反向解析为 SQL 语句。

问题验证

在下面的例子中,我们创建了一个事件触发器,在命令结束处捕获该数据库中发生的 DDL 事件。

CREATE OR REPLACE FUNCTION ddl_trigger_func()
  RETURNS event_trigger AS $$
DECLARE
  ddl record;
BEGIN
  FOR ddl IN SELECT * FROM pg_event_trigger_ddl_commands()
  LOOP
    RAISE NOTICE 'ddl command: %',
      pg_ddl_command_deparse(ddl.command);
  END LOOP;
END $$ LANGUAGE plpgsql;

CREATE EVENT TRIGGER ddl_event_trigger
    ON ddl_command_end
    EXECUTE PROCEDURE ddl_trigger_func();

让我们来创建一个模式myschema,切换到新建的模式创建和删除一个表t_table

CREATE SCHEMA myschema;

SET search_path TO myschema;

CREATE TABLE t_table (id integer, name text);

DROP TABLE t_table;

在上面的例子中,我们会发现,在创建和删除表t_table时,事件触发器捕获到的 DDL 事件中包含了对象的模式信息。