pgsql-trigger跟踪值更改

e4yzc0pl  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(275)

我试图在pgsql中编写一个触发器函数来跟踪tablea中的值更改(tablea更新后的触发器)。跟踪记录将存储在表B中。

CREATE TABLE TableA (
  ID SERIAL NOT NULL,
  ANumber integer NOT NULL,
  ADate date  NOT NULL,
  ABoolean boolean NOT NULL
);

-- table for tracking changes
CREATE TABLE TableB (
  ID SERIAL NOT NULL,
  Description varchar(100) NOT NULL
);

触发程序的主体应该如下所示。。。

IF NEW.ANumber <> OLD.ANumber then
     INSERT INTO TableB (Description)
      VALUES (CONCAT('The value ', OLD.ANumber, ' changed to ', NEW.ANumber));
     RETURN NEW;
    END IF;

   IF NEW.ABoolean <> OLD.ABoolean then
    INSERT INTO TableB (Description)
     VALUES (CONCAT('The value changed to ', NEW.ABoolean ));
    RETURN NEW;
   END IF;

我在pgsql文档中发现,我需要这样创建触发器

CREATE TRIGGER log_changes
AFTER UPDATE ON TableA
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE FUNCTION log_changes();

问题是如果我在表中更改多个列。表B中只有一条新记录对应于发生值更改的第一列。
有什么办法解决这个问题吗?

bkhjykvo

bkhjykvo1#

从if块中取出return语句,如下所示:

IF NEW.ANumber <> OLD.ANumber then
 INSERT INTO TableB (Description)
  VALUES (CONCAT('The value ', OLD.ANumber, ' changed to ', NEW.ANumber));    
END IF;

IF NEW.ABoolean <> OLD.ABoolean then
  INSERT INTO TableB (Description)
    VALUES (CONCAT('The value changed to ', NEW.ABoolean ));
END IF;
RETURN NEW;

相关问题