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

标签 postgresql db2 database-trigger

我正在尝试将以下触发器从 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/

相关文章:

java - 使用类型 4 驱动程序从 db2 访问数据时抛出未捕获的异常

db2 - SAS通过ODBC错误连接到DB2

mysql - DECLARE 在 MYSQL TRIGGER 中不起作用

sql - Postgres 获取已按主键排序的索引

python - 将大型 DataFrame 从 Pandas 加载到 Postgresql

sql - 对象结构关系数据库设计

MySQL:如何将参数传递给触发器

sql - 为什么加入需要花费大量时间来执行?

c - C 中的嵌入式 SQL,有没有办法使表名可变?

postgresql - pgSQL - INSERT 之前触发函数检查是否存在具有相同 id 的记录