Функция запуска логической репликации PostgreSQL 10 не выполнена - PullRequest
0 голосов
/ 19 июня 2019

Я реализовал логическую репликацию в PostgreSQL 10 в пределах 2 дБ на 2 разных серверах, и я знаю, что последовательности не синхронизированы, поэтому я создал функцию триггера, подобную этой, в обеих базах данных:

CREATE FUNCTION update_ogc_fid()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
AS $BODY$
Declare 
iInt integer;
BEGIN
execute 'Select nextval('|| chr(39) || 'address_ogc_fid_seq' || chr(39) ||');' into iInt;
NEW.ogc_fid = iInt;
RETURN NEW;
END;
$BODY$;

CREATE TRIGGER update_ogc_fid_address
    BEFORE INSERT 
    ON address
    FOR EACH ROW
    EXECUTE PROCEDURE update_ogc_fid();

Отчасти из-за того, что фактически используется просто нечетное ID в DB1 и даже в DB2, почему функция не запускается во второй базе данных?

Если я вставляю запись в DB1, у меня естьID 3, он выполняет репликацию, и в DB2 у меня есть та же запись с тем же ID, я собираюсь проверить последовательность в DB2 и по-прежнему 1 вместо 3.

Теперь я собираюсь вставить запись в DB2, и у меня есть ID 2, а затем 4.

Для того, чего я хочу достичь, это главная главная система, в случае, если она не работает, яя могу написать во втором, меня это не особо волнует, но я думаю, что в случае аварии, когда я собираюсь восстановить БД на неработающем сервере (возможно, с помощью резервной копии pg-dump), мне нужно обновить всепоследовательности для начала написанияон был там, где был раньше.

1 Ответ

1 голос
/ 19 июня 2019

Триггеры по умолчанию не выполняются на логических резервных серверах, поскольку для параметра session_replication_role при применении изменений установлено значение replica.

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

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