【问题标题】:Get Table Name of PostgreSQL Event Trigger获取 PostgreSQL 事件触发器的表名
【发布时间】:2020-03-31 09:42:36
【问题描述】:

我在 PostgreSQL 9.6 数据库中有多个表,我想在外部应用程序中监控和处理这些更改。

仅处理数据更改并不难,但现在我想监视要存储的数据库的结构更改。这就是我所拥有的:

CREATE OR REPLACE FUNCTION log_structureChanged()
    RETURNS event_trigger AS $$
BEGIN
    UPDATE dbchanged SET changed=2 WHERE table_name = TG_ARGV[0];
    RETURN NEW;
END; 
$$ LANGUAGE PLPGSQL;


CREATE EVENT TRIGGER testData_struc
    ON ddl_command_end 
    WHEN TAG IN ( 'CREATE TABLE', 'ALTER TABLE', 'DROP TABLE' )
    EXECUTE PROCEDURE log_structureChanged();

EXECUTE PROCEDURE 被调用时,我想解析已对其进行更改的表。 PostgreSQL 官方文档并没有真正帮助我——我也可能没有完全理解某些部分。

那么我该如何解析EVENT TRIGGER 触发的表呢?它是否存储在变量中?

【问题讨论】:

  • 对于CREATE TABLEDROP TABLE,您可以保存您当前拥有的表列表,然后使用information_schema.tables 比较添加或删除的值,以便您可以捕获表名。这对ALTER TABLE来说更难
  • @OtoShavadze 谢谢,您知道管理ALTER TABLE 的程序吗?

标签: sql postgresql eventtrigger postgresql-triggers


【解决方案1】:

作为described in the documentation,您可以调用函数pg_event_trigger_ddl_commands(),它将为每个受影响的对象返回一行。

您可以使用结果列 object_identity,其中包含受影响对象的文本描述,或 classidobjid,其中包含包含对象的目录表的对象 ID 和对象 ID受影响的对象。

【讨论】:

  • object 是否代表受影响的表名?
  • 是的。对于DROP TABLE,它将是一个表格,对于DROP TEXT SEARCH DICTIONARY,它将是一个全文搜索字典。
  • 非常感谢您!我将您发布的链接向下滚动了一点,并且有 Table Rewrite 事件的文档。这相当于ALTER TABLE 事件吗?
  • ALTER TABLE 重写表的语句。
  • @torblerone - 我认为你需要投票的答案,如果你发现,那很有帮助
猜你喜欢
  • 2017-02-11
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多