(Postgresql) заставить функцию запуска таблицы вставлять значение идентификатора измененной строки в таблицу журнала для пользовательской репликации

Для 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();

В конечном итоге это делается для двунаправленной репликации с использованием триггеров. Спасибо за любое внимание или рекомендации. Буду редактировать по мере необходимости.

Не заключайте в кавычки старые и новые значения, которые вы хотите вставить. Если вы поместите их в кавычки, вы буквально вставите строку «NEW.ID» вместо нового идентификатора.

Nate 07.02.2019 15:12

@Nate Извините, опечатка с моей стороны. отредактировано. В моем коде не было кавычек вокруг записей NEW и OLD NAME и ID; просто значения операции. Я все еще получаю ОШИБКУ: запись «новая» не имеет поля «id», которое я устраняю. Спасибо.

user2620054 07.02.2019 15:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 543
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог решить эту проблему, изменив 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();

Другие вопросы по теме