【问题标题】:Apply a single trigger procedure to many different tables将单个触发器过程应用于许多不同的表
【发布时间】:2013-03-12 03:24:33
【问题描述】:

在我的 PostgreSQL 9.1 数据库中,我有多个表和一个触发器函数。

现在我正在使用该触发器函数为每个表创建触发器。

这种方法运行良好。我的老板要求我通过重新使用触发器功能来创建触发器(仅一次)。我的数据库中的所有表都应该使用这个触发器函数。

【问题讨论】:

    标签: postgresql triggers postgresql-9.1


    【解决方案1】:

    您可以在 PostgreSQL 的 Audit Trigger 示例中找到使用 PL/PgSQL 创建具有动态 SQL 的触发器的示例。相同的方法适用于任何其他 DDL。

    查看函数audit.audit_table 以及formatEXECUTE 的用法。

    也就是说,需要以程序方式创建表可能(但并不总是)表明架构设计存在问题。

    动态SQL创建表的简单示例:

    CREATE OR REPLACE FUNCTION demo_dynamic_table(tablename text) RETURNS void AS $$                                                                                      
    BEGIN                                                                                                                                                                          
        EXECUTE format('CREATE TABLE %I (id serial primary key);', tablename);
    END;
    $$ LANGUAGE plpgsql;
    

    同样的方法适用于触发器创建等

    【讨论】:

    • 感谢您在此方面花费宝贵的时间,SELECT audit.audit_table('target_table_name', 'true', 'false', '{version_col, changed_by, changed_timestamp}'::text[]); 在此过程中,他们将单个表名作为第一个参数传递,我可以在该参数中传递我的所有表吗?
    • @GLOIERTECH。 “你的所有桌子”?你的意思是你所有的表,即表名列表?
    • @GLOIERTECH。如果要传入所有表的列表,可以传递数组或使用VARIADIC 函数,但最好只在集合上调用函数,例如SELECT create_my_trigger(tablename) FROM (VALUES('table1'),('table2'),('table3')) tablenames(tablename);
    【解决方案2】:

    您可以创建用于创建表的 PL/pgSQL 过程并将您的触发器创建代码移动到其中

    【讨论】:

    • 显然您的建议将为我的数据库中的每个表创建触发器,我的老板寻找的是为所有 20 个表创建 1 个触发器。换句话说,它可能是一个共享触发器。有没有可能这样做?
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2012-12-18
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多