【问题标题】:On postgreSQL update trigger audit, original table updates fine, but multiple rows appear in the audit table.在 postgreSQL 更新触发器审计中,原始表更新正常,但审计表中出现多行。
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 是的,但是我想使用 SELECT 插入 code 列。它属于原来的events表,不使用SELECT不知道怎么插入到审计表中...我看到其他使用SELECT的例子所以我猜是正确的方法。我将只用INSERT 进行实验。
    • 对不起,我找到了答案。只需使用OLD.code。它工作正常!感谢您的提示。
    猜你喜欢
    • 2021-05-20
    • 2021-09-05
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2011-07-10
    相关资源
    最近更新 更多