Переписать триггер DB2 как триггер PostgreSQL - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь перенести следующий триггер из 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)

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

вы можете добавить условие при срабатывании триггера:

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;
0 голосов
/ 03 октября 2018

Просто добавьте еще один, если:

IF (NEW.field1 <> OLD.field1) THEN
     IF (TG_OP = 'UPDATE') THEN
...