在postgreSQL更新触发器审计中,原始表更新正常,但审计表中出现多行。

时间:2015-05-31 16:17:16

标签: sql postgresql

我有一个应用了触发器的表,如果它发生更改,它会填充审计表。我用两个字段创建了原始表:

CREATE TABLE events(
    code serial8 NOT NULL,
    event date NOT NULL,
    );

每当更新第一个表上的事件日期时,我想要一个触发器来填充审计表:

CREATE TABLE audit(
    date_log date,
    time_log time,
    userid char(20),
    event_code int, 
    action_log text,
    old_date date,
    new_date date
); 

触发功能:

CREATE OR REPLACE FUNCTION auditing() RETURNS trigger AS $$ BEGIN
    INSERT INTO audit(date_log,time_log,userid,event_code,action_log,old_date,new_date)
    SELECT current_date,current_time,current_user,code,tg_op,OLD.event, NEW.event FROM events;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

我设置了这样的触发器:

CREATE TRIGGER audit_dates
AFTER UPDATE OF event ON events
FOR EACH ROW EXECUTE PROCEDURE auditing();

我遇到的问题是每当我运行更新功能时,例如:

UPDATE events SET event = '2013-03-01' WHERE code = 1;

原始表更新得很好,但是应该审计这个表的表,为原始表所拥有的每一行生成一个审计行,所以如果原始表有200行而我只更新其中一行,那么200个新行在审计表中生成。

我正在考虑是否这是因为我创建了触发器FOR EACH ROW,但同时我一直在阅读docs on this,看起来这就是我需要的语法。

每次更新原始表时,在审计表中只获取一个新行的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您在触发器中有SELECT ... FROM events,因此它正在选择所有事件。您可以使用简单的INSERT ... VALUES,因为NEW和OLD是变量。