powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / каскадный тригер
4 сообщений из 4, страница 1 из 1
каскадный тригер
    #39318384
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день, есть тригер который разруливает партиции
вместо update делаем делет + инсерт (в инсерте есть тригер который срабатывает при replica, и он распихивает по партициям)
необходимо что бы на делет были отключены все каскадные тригеры:

изначально было так:
Код: sql
1.
2.
3.
4.
5.
SET session_replication_role TO 'replica';
with d as (DELETE FROM public.tablica where id = OLD.id),
i as (insert into public.tablica values (NEW.*))'
select 0 into _err;
SET session_replication_role TO 'origin';


но теперь появились еще тригеры на insert которые тоже должны выполнятся, т.е. необходимо
session_replication_role TO 'replica';
сделать только на delete, в котором есть свои тригеры before/after которые должны срабатывать только когда реально идет удаление записи.

подскажите какие идеи есть у вас?
...
Рейтинг: 0 / 0
каскадный тригер
    #39318404
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мое видение пока такое, но может есть проще:
добавить в таблицу еще одно поле sign_del (там либо null всегда будет либо в момент выполнения мы можем записать false)

на пермо выполняющем тригере при изменении сделать запись
Код: sql
1.
old.sign_del = false


при делете в первом тригере проверяем если old.sign_del = false то ставим
Код: sql
1.
SET session_replication_role TO 'replica';


на последнем тригере в делет (который будет выполнятся и при реплики) ставим
Код: sql
1.
SET session_replication_role TO 'origin';


из тригера на инсерт убрать полностью установки session_replication_role, оставить только это:
Код: sql
1.
2.
3.
with d as (DELETE FROM public.tablica where id = OLD.id),
i as (insert into public.tablica values (NEW.*))
select 0 into _err;
...
Рейтинг: 0 / 0
каскадный тригер
    #39318747
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел очень простое решение, правок минимум, простота работы-)
...
Рейтинг: 0 / 0
каскадный тригер
    #39318829
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaдобрый день, есть тригер который разруливает партиции
вместо update делаем делет + инсерт (в инсерте есть тригер который срабатывает при replica, и он распихивает по партициям)
необходимо что бы на делет были отключены все каскадные тригеры:

изначально было так:
Код: sql
1.
2.
3.
4.
5.
SET session_replication_role TO 'replica';
with d as (DELETE FROM public.tablica where id = OLD.id),
i as (insert into public.tablica values (NEW.*))'
select 0 into _err;
SET session_replication_role TO 'origin';


но теперь появились еще тригеры на insert которые тоже должны выполнятся, т.е. необходимо
session_replication_role TO 'replica';
сделать только на delete, в котором есть свои тригеры before/after которые должны срабатывать только когда реально идет удаление записи.

подскажите какие идеи есть у вас?

Что то вы ОЧЕНЬ странное делаете. Динамическое управление session_replication_role в приложении крайне дурная идея.
Для начала SET session_replication_role TO 'replica'; отключает незаметно для базы проверку всех FK при операциях.
Ну и вообще очень странное решение для партиционирования.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / каскадный тригер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]