我有一个应用了触发器的表,如果它发生更改,它会填充审计表。我用两个字段创建了原始表:
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,看起来这就是我需要的语法。
每次更新原始表时,在审计表中只获取一个新行的正确方法是什么?
答案 0 :(得分:2)
您在触发器中有SELECT ... FROM events
,因此它正在选择所有事件。您可以使用简单的INSERT ... VALUES
,因为NEW和OLD是变量。