如何从NEW或OLD插入PostgreSQL触发器中的动态命名表

时间:2015-06-07 19:10:54

标签: postgresql

我有许多带有关联审计表的表。这些表分别命名为X和X_aud,其中X是要审计的表的名称。我有一个在INSERT,UPDATE或DELETE之前调用的触发器函数,我想为所有表调用相同的函数,但我无法弄清楚如何编写触发器函数。我到目前为止所尝试的是:

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;

还有各种其他版本的NEW。*在引号内等。但似乎没有任何效果。有没有其他人尝试类似的东西,如果是这样你是怎么做的

由于

2 个答案:

答案 0 :(得分:0)

postgresql wiki上有一些可用的审计触发器示例。

pre 9.1

9.1 or above

答案 1 :(得分:0)

这个问题已被提出(并且很好地回答)。解决方案是使用EXECUTE ... USING语法。这当然适用于9.3,但最初的答案说它在8.4及以上工作

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