PostgreSQL触发器不会插入审计值

时间:2015-12-14 02:46:22

标签: database postgresql triggers

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

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

表格是这样创建的:

Firebase.getDefaultConfig().setPersistenceEnabled(true);
Firebase ref = new Firebase(apiUrl);
ref.keepSynced(true);

触发器的创建方式如下:

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")
);

任何帮助?

1 个答案:

答案 0 :(得分:1)

您无法将NULL与某个值进行比较,即NULL = 2NULL <> 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()NEW记录,

或(可能更好)OLD

...
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;
...