Изменены данные триггера реплицированной таблицы - postgres - PullRequest
1 голос
/ 16 октября 2019

У меня есть 2 БД, 1-й - это мастер-база данных, а 2-й - это реплика базы данных (только некоторые таблицы из главной БД)Я пытаюсь добавить триггер для таблицы реплик для перехвата, когда он реплицируется из основных таблиц базы данных.

Я использовал триггер для перехвата операций вставки, удаления и обновления, но, похоже, это не работает. этот триггер работает только для некоторой таблицы, которая отличается от оператора SQL. Не работает для таблиц реплик.

Есть ли способ отлова изменений таблиц реплик? Я использовал go lang и следую руководству этого поста https://coussej.github.io/2015/09/15/Listening-to-generic-JSON-notifications-from-PostgreSQL-in-Go/

я сделал эти шаги:

-- create function
CREATE OR REPLACE FUNCTION notify_event() RETURNS TRIGGER AS $$
DECLARE
data json;
notification json;
BEGIN
IF (TG_OP = 'DELETE') THEN
data = row_to_json(OLD);
ELSE
data = row_to_json(NEW);
END IF;
notification = json_build_object(
'table',TG_TABLE_NAME,
'action', TG_OP,
'data', data);
PERFORM pg_notify('events',notification::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- create trigger
CREATE TRIGGER user_warehouse_notify_event
AFTER INSERT OR UPDATE OR DELETE ON users_warehouse_rel
FOR EACH ROW EXECUTE PROCEDURE notify_event();

-- enable replica trigger 
ALTER TABLE users_warehouse_rel ENABLE REPLICA TRIGGER user_warehouse_notify_event

это все еще не работает

1 Ответ

1 голос
/ 16 октября 2019

Когда логическая репликация применяет свои изменения, session_replication_role устанавливается на replica, чтобы обычные триггеры не запускались.

Чтобы изменить это для своего триггера, используйте

ALTER TABLE atable ENABLE ALWAYS TRIGGER trigger_name;

Подумайте дважды, прежде чем использовать это - плохо определенные триггеры могут нарушить репликацию.

...