powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как отключить тригеру самого себя во время его выполнения
17 сообщений из 17, страница 1 из 1
Как отключить тригеру самого себя во время его выполнения
    #36707999
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица Rodnya(kod_chela, kod_rodstv, kod_step_rodsva)
где
kod_chela - код человека
kod_rodstv - код человека - родственника
kod_step_rodsva - степень родства
Мне унжно написать тригер, такой что при добавлении одному человеку родственника только (мать, отец, сын, дочь, жена, муж, брат сестра), у родственника бы появлялся этот человек с соответствующей обратной степенью родства и + у родственнкиа появлялись бы все те родственники что у первого и у первого родственники второго. Впринципе на клиенте я это реализовал, и все нормально работает. Но подумал что в БД будет лучше.
Тригер нужно на Update и на Insert. Так вставка же будет происходить в одну и ту же таблицу. Как отключить срабатывание этого триггера на вставку когда я буду вставлять новые записи в теле функции триггера, чтобы не возникало зацикливаний?
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708158
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
откажитесь от избыточности в структуре базы, и не придётся дублировать, заморачиваться с триггерами.

object1 (человек)
object2 (человек)
link_type (тип связи)

при этом есть тип связи 'родитель-ребёнок', но нет обратной связи 'ребёнок-родитель'. есть тип связи 'муж-жена', но нет связи 'жена-муж'. для поиска всех детей: where object1=? and link_type='родитель-ребёнок', а для поиска родителей: where object2=? and link_type='родитель-ребёнок'.
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708314
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это все конечно хорошо, но эта родственная связь важна для вывода в выходные документы, и как потом понмать кто кому кем приходится?

может тогда два поля ввести кто первый второму и кто второй первому
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708431
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81как ... понмать кто кому кем приходится?уточните, какие проблемы видите?

PG81может тогда два поля ввести кто первый второму и кто второй первомуэто и определяется типом связи. например в строке с link_type='родитель-ребёнок' значение object1 - родитель, object2 - ребёнок. (связь 'родитель-ребёнок' направленная.)
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708844
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81Есть таблица Rodnya(kod_chela, kod_rodstv, kod_step_rodsva)
где
kod_chela - код человека
kod_rodstv - код человека - родственника
kod_step_rodsva - степень родства
Мне унжно написать тригер, такой что при добавлении одному человеку родственника только (мать, отец, сын, дочь, жена, муж, брат сестра), у родственника бы появлялся этот человек с соответствующей обратной степенью родства и + у родственнкиа появлялись бы все те родственники что у первого и у первого родственники второго. Впринципе на клиенте я это реализовал, и все нормально работает. Но подумал что в БД будет лучше.
Тригер нужно на Update и на Insert. Так вставка же будет происходить в одну и ту же таблицу. Как отключить срабатывание этого триггера на вставку когда я буду вставлять новые записи в теле функции триггера, чтобы не возникало зацикливаний?
присоединяюсь к LeXa NalBat

более того, если 2 перца - дети мистера Х и миссис Y, то они ,безусловно, братья.
т.е. всё что вы рисуете через "kod_step_rodsva" - это надо бы забыть как дурной сон.
Ибо "степень родства" есть просто полностью определённая (иногда многозначная) ф-я от предков 1-го уровня (предков 1-го уровня ровно 2 штуки нынче, если не учитывать клонирование и генную инженерию).
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708863
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaИбо "степень родства" есть просто полностью определённая (иногда многозначная) ф-я от предков 1-го уровня (предков 1-го уровня ровно 2 штуки нынче, если не учитывать клонирование и генную инженерию).- кровное родство - с точностью до рекурсии. (по поколениям).


некровное (свояки, зятья/невестки свёкры/тёщи и т.п.) - зависимость от брака.



т.е. я бы предложил сущность "брак" (в т.ч. гражданский, разовый и т.п. - т.е. "биологическая пара") и определял бы детей от брака (а не от отдельно папы и отдельно мамы). тогда все степени родства (и кровные и некровные) считались бы через связи типа "дети" от сущностей типа "брак". В зависимости от количества путей по графу между 2-мя людьми имеем и количество значений ф-ии "родство".
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708874
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, забыл еще один момент. взаимоотношения нечеткой природы моно таки учитывать вашей таблицей связей.
А мименно - друзей, знакомых, одноклассников и ... приёмных детей.
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36708983
Robert Ayrapetyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не, у родственников столько связей возможных, что без "тип связи" точно никуда не уедешь, придется этот дурной сон реализовывать.
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36709981
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле суть вопроса абстрагируясь от родства вот в чем: после вставки записи в таблицу записи стработает триггер. В триггере я определяю что мне нужно сделать и начинаю вставлять опять же в жту таблицу новые записи и так как происходит вставка опять будет срабатывать триггер.Как сделать так чтобы тригер на вставляемые записи из триггера не срабатывал.

Вот хотелосьбы получить ответ на этот вопрос, для начала, так как времени не осталось так что я буду делать так как уже решил, а потом уже, когда будем делать следующую версию, если найду получше вариан, то реализую его. А этот вариант я уже сделал, но добавление происходит на клиенте и все работает, но я решил сделать триггером, так думаю будетлучше.
Ну а пока конечно порассуждать мне интересно как можно сделать это эффективней.


В таблице по идее должны быть только близкие родственники. Я уже писал (мать, отец, сын, дочь, жена, муж, брат, сестра)но пользователь может добавить и еще кого угодно, но по ним отслеживать , кто кому кем приходится и добавлять я не собираюсь, так как слишком сложные зависимости получаются и нужно будт запрашивать у пользователя дополнительные данные чтобы все правильно расставить.

LeXa NalBat
я имел ввиду что из предложенной вами схемы мне не совсем понятно как определеить кто кому кем приходится из выше перечисленных степеней родства.
Вобщем толком не понял ваш принцип если честно.
Еще один важный аспект, одно дело хранить такую структуру в БД, может и можно все отуда вытащить, но другое дело как реализовать интерфес для пользователя чтобы ему было понятно, кто кем приходится. Пользователи у нас понимаетели клавиатуры боятся не то чтобы понять связь ,что означет ребенок - родитель.
Вот объясните на пальцах, например, есть 4 человека
1-А М
2-B Ж
3-C М
4-D Ж,
где A и B муж и жена, а C и D их дети
Как будет заполнена таблица.
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36710002
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
PG81,
ищем, читаем доку по custom_variable_classes
в триггере делам что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IF current_setting('my_var.disable_trigger') = '0'
THEN
  PERFORM set_config ('my_var.disable_trigger',  1 , true);

  --тело Вашего триггера;

  PERFORM set_config ('my_var.disable_trigger',  0 , true);
  RETURN NEW или OLD;
ELSE
  RETURN NEW или OLD;
END IF;

...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36710013
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
p.s.
дальше заголовка темы не читал.
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36710242
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V&N,

О благодарю, то что надо
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36726185
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81Вот объясните на пальцах, например, есть 4 человека
1-А М
2-B Ж
3-C М
4-D Ж,
где A и B муж и жена, а C и D их дети
Как будет заполнена таблица.person (id,name,sex)
1,'A','муж'
2,'B','жен'
3,'C','муж'
4,'D','жен'

relation (person_id_1,person_id_2,link_type)
1,2,'брак'
1,3,'родитель'
1,4,'родитель'
2,3,'родитель'
2,4,'родитель'

например найти (родного!) отца для C:
Код: plaintext
1.
2.
3.
select p1.* from person as p1
  join relation as r10 on ( p1.id=r10.person_id_1 )
  join person p0 on ( p0.id=r10.person_id_2 )
where p0.name='C' and p1.sex='муж' and r10.link_type='родитель';

например найти (родных!) братьев и сестёр для C:
Код: plaintext
1.
2.
3.
4.
5.
select distinct p2.* from person as p2
  join relation as r21 on ( p2.id=r21.person_id_2 )
  join person as p1 on ( p1.id=r21.person_id_1 )
  join relation as r10 on ( p1.id=r10.person_id_1 )
  join person p0 on ( p0.id=r10.person_id_2 )
where p0.name='C' and r10.link_type='родитель' and r21.link_type='родитель';
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #36726310
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

Не дай Бог разрешат однополые браки )
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #37240940
Big Andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_,
Несомненно последние два топега станут украшением ibash' а...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как отключить тригеру самого себя во время его выполнения
    #38928711
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--отключение всех триггеров
SET session_replication_role = replica;
SET session_replication_role = default;
...
Рейтинг: 0 / 0
Как отключить тригеру самого себя во время его выполнения
    #38928746
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81--отключение всех триггеров
SET session_replication_role = replica;
SET session_replication_role = default;
это в корне неверное утверждение

если только не делать оговорку об "обычности" триггеров. и "как правило"

у меня половина, если не больше , триггеров отрабатывают с ролью replica тоже -- по приходу данных с ноды данных в "olap"-центр. я их специально так писал
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как отключить тригеру самого себя во время его выполнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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