gpt4 book ai didi

postgresql - 将 DB2 触发器重写为 PostgreSQL 触发器

转载 作者:行者123 更新时间:2023-11-29 14:30:25 26 4
gpt4 key购买 nike

我正在尝试将以下触发器从 DB2 迁移到 PostgreSQL:

DB2 触发器:

CREATE TRIGGER trig1
AFTER UPDATE ON table1
REFERENCING OLD AS O NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (N.field1 <> O.field1)
BEGIN ATOMIC
INSERT INTO table1(field1, field2)
VALUES (N.field1, O.field2);
END #

我将触发器重写为PostgreSQL标准(不确定是否正确):

PostgreSQL 触发器:

CREATE OR REPLACE FUNCTION create_table1_history() RETURNS TRIGGER AS $table1_history$
BEGIN
IF (TG_OP = 'UPDATE') THEN
INSERT INTO table1
SELECT
NEW.field1, OLD.field2;
RETURN OLD;
END IF;
RETURN NULL;
END;
$table1_history$ LANGUAGE plpgsql;


CREATE TRIGGER trig1
AFTER UPDATE ON table1
FOR EACH ROW EXECUTE PROCEDURE create_table1_history();

现在我不确定如何在我的 PostgreSQL 触发器中添加以下条件?

WHEN (N.field1 <> O.field1)

最佳答案

您可以添加触发触发器的条件:

CREATE TRIGGER trig1
AFTER UPDATE ON table1
FOR EACH ROW
WHEN (new.field1 <> old.field1)
EXECUTE PROCEDURE create_table1_history();

如果列可以包含 NULL 值,使用它可能会更好

    WHEN (new.field1 IS DISTINCT FROM old.field1)

触发器功能可以简化,并且您不需要检查 TG_OP,因为触发器本身被定义为仅在更新时触发

CREATE OR REPLACE FUNCTION create_table1_history() 
RETURNS TRIGGER AS
$table1_history$
BEGIN
INSERT INTO history_table
values (NEW.field1, OLD.field2);
RETURN OLD;
END;
$table1_history$ LANGUAGE plpgsql;

关于postgresql - 将 DB2 触发器重写为 PostgreSQL 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52625773/

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