【问题标题】:PostgreSQL trigger won't inset audit valuePostgreSQL 触发器不会插入审计值
【发布时间】:2015-12-14 11:11:19
【问题描述】:

我正在使用 PostgreSQL 8.1 并为表创建了一个触发器,因此如果更新或插入某些内容,它也会在日志表中注册,但我遇到了 NULL 值的问题:

如果我使用 NULL 值更新列,那么它不会向日志中插入任何值,但是使用 char 到 char 会很好,所以也许我遗漏了一些东西。

表是这样创建的:

CREATE TABLE log_test(

    id_test         integer   NOT NULL DEFAULT nextval('id_test_seq'),
    type         char(3),
    product         char(10),
    table             char(15),
    field            char(10),
    old_val            char(10),
    new_val            char(10),
    user            char(10),
    event            char(10),
    date           timestamp with time zone      NOT NULL DEFAULT now(),
 CONSTRAINT "log_test_prim" PRIMARY KEY ("id_test")
);

触发器的创建方式如下:

CREATE FUNCTION "public"."log_test_trigger" () RETURNS "trigger" AS 'BEGIN
...
   IF (TG_OP = ''UPDATE'') THEN
            IF (NEW.name <> OLD.name) THEN
                   INSERT INTO log_test (type, table, field, old_val, new_val, user, event) VALUES (NEW.type,  TG_RELNAME, ''name'', OLD.name, NEW.name, NEW.user, ''UPDATE'');
            END IF;
...
END;' LANGUAGE "plpgsql"
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER

有什么帮助吗?

【问题讨论】:

    标签: database postgresql triggers


    【解决方案1】:

    您不能将NULL 与一个值进行比较,即NULL = 2NULL &lt;&gt; 2 都是NULL。加ISNULL

    ...
    IF (TG_OP = ''UPDATE'') THEN
        IF (NEW.name <> OLD.name OR NEW.name ISNULL) THEN
            INSERT INTO log_test (type, table, field, old_val, new_val, user, event) VALUES (NEW.type,  TG_RELNAME, ''name'', OLD.name, NEW.name, NEW.user, ''UPDATE'');
        END IF;
    ...
    

    或(可能更好)coalesce() 用于 NEWOLD 记录:

    ...
    IF (TG_OP = ''UPDATE'') THEN
        IF (coalesce(NEW.name, '') <> coalesce(OLD.name, '')) THEN
            INSERT INTO log_test (type, table, field, old_val, new_val, user, event) VALUES (NEW.type,  TG_RELNAME, ''name'', OLD.name, NEW.name, NEW.user, ''UPDATE'');
        END IF;
    ...
    

    【讨论】:

    • 你完全正确。我想到了 COALESCE 函数,但错过了比较。
    • 哦...整数和日期值呢?
    • 您可以将coalesce() 用于任何简单类型。只选择合适的默认值(函数的最后一个参数)。
    • 它不起作用,因为我在尝试更新行时收到了数字类型的错误。编辑:还有日期类型。
    • 应该可以。添加带有代码和错误消息的新问题。
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2020-11-07
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多