(Postgresql) сделать так, чтобы функция триггера таблицы вставляла значение ID измененной строки в таблицу журнала, для пользовательской репликации - PullRequest
0 голосов
/ 07 февраля 2019

Для Postgresql --- и в конечном итоге Sybase ADS --- у меня есть таблицы, которые будут реплицироваться с использованием самодельных триггеров.Триггеры имеют функцию, которая должна записывать информацию об изменениях INSERT UPDATE DELETE, которая включает в себя операцию I / U / D и идентификатор строки, которая изменилась.Я использую тестовые таблицы со столбцом имени и идентификатором с автоматическим увеличением для проверки двунаправленной репликации.

Если я сделаю вставку в таблицу NAME, например, добавив «JOHN» с автоматическим идентификатором «1», яв состоянии вставить это значение идентификатора и даже, возможно, 'JOHN' в таблицу журнала?Я смотрю на параметры OLD.ID или NEW.ID, но не знаю, как это работает.Мой код триггера / функции:

    CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('DELETE', OLD.ID, OLD.NAME);
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID ,NEW.NAME);
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID , NEW.NAME);
            RETURN NEW;
        END IF;
        RETURN NULL; 
    END;
$ReplInsert$ LANGUAGE plpgsql;

CREATE TRIGGER logTrg
AFTER INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
    FOR EACH ROW EXECUTE PROCEDURE Insert();

Это в конечном итоге для двунаправленной репликации с использованием триггеров.Спасибо за любые соображения или рекомендации.Я буду редактировать по мере необходимости.

1 Ответ

0 голосов
/ 09 февраля 2019

Я смог решить эту проблему, изменив AFTER на BEFORE в триггере, что, как я полагал, поначалу не сработало, или:

    CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('DELETE', OLD.ID, OLD.NAME);
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID ,NEW.NAME);
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID , NEW.NAME);
            RETURN NEW;
        END IF;
        RETURN NULL; 
    END;
$ReplInsert$ LANGUAGE plpgsql;

CREATE TRIGGER logTrg
BEFORE INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
    FOR EACH ROW EXECUTE PROCEDURE Insert();
...