【发布时间】:2015-06-01 00:50:09
【问题描述】:
我有一个应用了触发器的表,如果它发生变化,它会填充一个审计表。我创建了只有两个字段的原始表:
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 ,看起来这是我需要的语法。
每次更新原始表时,在审计表中只获取一个新行的正确方法是什么?
【问题讨论】:
标签: sql postgresql