Postgresql: триггер на внешней таблице для выполнения функции усечения / вставки в локальную таблицу - PullRequest
0 голосов
/ 02 февраля 2020

Я хотел бы создать триггер для выполнения функции для усечения локальной таблицы базы данных и вставки новых данных. Выполнение триггера должно начинаться после вставки новой строки в таблицу внешней базы данных. Я много читал о создании триггеров на стороннем столе, но для меня это не работает. Кажется, что триггер не выполняет функцию, когда новая строка будет вставлена ​​во внешнюю таблицу. Кажется, что триггер не может видеть это новое событие вставки строки. Что я сделал:

  1. Создал стороннюю таблицу в моей локальной базе данных, назовем ее Foreign_table. Я проверил, я могу читать данные.
  2. Создана функция для усечения локальной таблицы и вставки новых данных:

    CREATE or replace FUNCTION public.reset_insert_table()
    RETURNS TRIGGER
        LANGUAGE 'plpgsql'
        SET search_path=public
     AS $BODY$
    BEGIN
        create temporary table temporary_table_tmp
        as select * from public.table1;
        TRUNCATE TABLE public.table2;
        insert into table2
            select * from temporary_table_tmp;
        DROP table temporary_table_tmp; 
    END;    
    $BODY$;
    
  3. Создан триггер для запуска функции reset_insert_table () '

    CREATE TRIGGER local_table_update
        AFTER INSERT
        ON 'foreign_table'
        FOR EACH ROW EXECUTE PROCEDURE reset_insert_table();
    
  4. Выполнен тест: вставлена ​​новая строка в таблицу внешней базы данных' foreign_table ', но я не вижу, чтобы таблица была усечена, а новые данные не вставлены. Вставка в foreign_tale была сделана в чужой базе данных. Проблема также была проверена, работает ли эта функция триггера, выполнение вручную вызовет ошибку: EXECUTE PROCEDURE reset_insert_table(); ОШИБКА: синтаксическая ошибка в или около "execute". Пробовал также CALL и SELECT. Я создал ту же функцию для тестирования, но вместо этого определил «RETURNS TRIGGER», использовал «RETURNS VOID» и функция работает.

Может кто-нибудь сказать, почему мое решение не работает и вызывает срабатывание на сторонних таблицах должны видеть события, происходящие в чужих таблицах?

1 Ответ

1 голос
/ 02 февраля 2020

Согласно вашим комментариям, вы, похоже, используете логическую репликацию.

В то время как изменения данных воспроизводятся в режиме ожидания с логической репликацией, для параметра session_replication_role установлено значение replica для сохранения триггеров и внешних ключевые ограничения от работы.

Если вы хотите, чтобы триггер запускался при воспроизведении данных посредством логической репликации, вы должны объявить его как триггер реплики :

ALTER TABLE a2 ENABLE REPLICA TRIGGER trigger_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...