gpt4 book ai didi

sql - 在 postgreSQL update trigger audit 上,原始表更新正常,但审计表中出现多行。

转载 作者:行者123 更新时间:2023-11-29 13:00:50 24 4
gpt4 key购买 nike

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

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看起来这是我需要的语法。

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

最佳答案

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

关于sql - 在 postgreSQL update trigger audit 上,原始表更新正常,但审计表中出现多行。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30559629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com