如何在PostgreSQL触发器中从新表或旧表插入动态命名的表

如何在PostgreSQL触发器中从新表或旧表插入动态命名的表,postgresql,Postgresql,我有许多表与相关联的审计表。这些表分别命名为X和X_aud,其中X是要审核的表的名称。我有一个在插入、更新或删除之前调用的触发器函数,我想为所有表调用相同的函数,但我不知道如何编写触发器函数。到目前为止,我尝试的是: CREATE OR REPLACE FUNCTION audit_maintenance() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'DELETE') THEN EXECUTE 'INSERT INTO ' || TG_TABLE_N

我有许多表与相关联的审计表。这些表分别命名为X和X_aud,其中X是要审核的表的名称。我有一个在插入、更新或删除之前调用的触发器函数,我想为所有表调用相同的函数,但我不知道如何编写触发器函数。到目前为止,我尝试的是:

CREATE OR REPLACE FUNCTION audit_maintenance() RETURNS trigger AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
   EXECUTE 'INSERT INTO ' || TG_TABLE_NAME || '_aud VALUES ' || OLD.*;
   RETURN OLD;
END IF;

EXECUTE 'INSERT INTO ' || TG_TABLE_NAME || '_aud VALUES ' || NEW.*;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;
和其他各种版本的新。*内的引号等,但似乎没有任何工作。有没有其他人尝试过类似的东西?如果有,你是怎么做的


感谢您,postgresql wiki上提供了一个两个审计触发器的示例


这个问题已经被提出(并且得到了很好的回答)。解决方案是使用执行。。。使用语法。这在9.3中确实有效,但最初的答案说它在8.4及以上版本中有效

EXECUTE 'INSERT INTO ' || TG_TABLE_NAME || '_aud SELECT $1.*' USING NEW;

谢谢Gary,但是我看不出一个触发器函数对多个表应用审计有任何用处。我遇到的问题是生成一条语句的语法,该语句可以更新一个表,该表的名称是根据被更改的表的名称生成的,同时引用新值和旧值