【发布时间】:2013-03-12 03:24:33
【问题描述】:
在我的 PostgreSQL 9.1 数据库中,我有多个表和一个触发器函数。
现在我正在使用该触发器函数为每个表创建触发器。
这种方法运行良好。我的老板要求我通过重新使用触发器功能来创建触发器(仅一次)。我的数据库中的所有表都应该使用这个触发器函数。
【问题讨论】:
标签: postgresql triggers postgresql-9.1
在我的 PostgreSQL 9.1 数据库中,我有多个表和一个触发器函数。
现在我正在使用该触发器函数为每个表创建触发器。
这种方法运行良好。我的老板要求我通过重新使用触发器功能来创建触发器(仅一次)。我的数据库中的所有表都应该使用这个触发器函数。
【问题讨论】:
标签: postgresql triggers postgresql-9.1
您可以在 PostgreSQL 的 Audit Trigger 示例中找到使用 PL/PgSQL 创建具有动态 SQL 的触发器的示例。相同的方法适用于任何其他 DDL。
查看函数audit.audit_table 以及format 和EXECUTE 的用法。
也就是说,需要以程序方式创建表可能(但并不总是)表明架构设计存在问题。
动态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[]); 在此过程中,他们将单个表名作为第一个参数传递,我可以在该参数中传递我的所有表吗?
VARIADIC 函数,但最好只在集合上调用函数,例如SELECT create_my_trigger(tablename) FROM (VALUES('table1'),('table2'),('table3')) tablenames(tablename);
您可以创建用于创建表的 PL/pgSQL 过程并将您的触发器创建代码移动到其中
【讨论】: