powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное удаление или запрет в завимости от параметра
9 сообщений из 9, страница 1 из 1
Каскадное удаление или запрет в завимости от параметра
    #35656578
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть нужда создать функцию (желательно на plpgsql) для удаления строк из таблицы.
Функция должна в зависимости от значения входного параметра либо удалять зависимые записи (т.е. делать каскадное удаление), либо при обнаружении зависимых записей валиться с ошибкой и ничего не удалять.
Есть возможность такое сотворить?
Пока в голову ничего умнее
Код: plaintext
1.
2.
3.
  if flag_delete_cascade then -- если нужно выполить каскадное удаление
	-- удаление зависимых записей
  end if;
ничего в голову не приходит (при этом констрейнты на таблицах сделать on delete restrict).
Хочется придумать решение получше.
Нет ли возможности заставить PostgreSQL воспринимать констрейнты то как "on delete cascade", то как "on delete restrict" в зависимости от входного параметра в функции?
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35657289
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pilot,

думаю, достаточно
1. создать ON DELETE CASCADE
2. довесить триггерок, бефоре делет, генерящий ошибку по вашему сложному условию.

(по любому - FK - это триггерок, но триггерок, реализуемый системой, т.ч. вряд ли стоит его дублировать самому. Особо -если каскады ветвистые. Но иногда таки имеет смысл.)
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35657335
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, так не пойдет.
Сама задача ведь откуда взялась - в пользовательском интерфейсе возле кнопки "Удалить запись" есть галочка "удалять зависимые объекты". В зависимости от этой галочки мне и нужно либо выполнить каскадное удаление, либо при обнаружении зависимых записей валиться с ошибкой.
Триггер тут не подходит из-за того, что он не сможет учесть флаг каскадного удаления, который подается на вход пользовательской функции.
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35657836
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PilotТриггер тут не подходит из-за того, что он не сможет учесть флаг каскадного удаления, который подается на вход пользовательской функции.

сможет. в функции устанавливайте переменную, например custom.do_cascade_delete = true, а в тригере - проверяйте её:

Код: plaintext
1.
2.
3.
4.
5.
6.
--- в функции
perform set_config('custom.do_cascade_delete', 'true', false);
. . .
---в триггере
if current_setting('custom.do_cascade_delete')::boolean then
. . .

что бы это работало нужно что бы в postgresql.conf в custom_variable_classes было custom, типа: custom_variable_classes = 'plperl,plperlu,custom'

+ что бы не обрабатывать исключение (ERROR: не распознанный параметр конфигурации: "custom.do_cascade_delete") - я бы ещё задал значение по умолчанию для этой переменной (в конце postgresql.conf):

custom.do_cascade_delete = false
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35659515
Pilot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доступа к администрированию сервера PostgreSQL у меня нет. Я пока не знаю, что там в файле настроек.
Сществует ли другой способ?
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35659677
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PilotДоступа к администрированию сервера PostgreSQL у меня нет. Я пока не знаю, что там в файле настроек.
Сществует ли другой способ?ну способов множество.

1. передача параметра:
1.а. До ведения кастом-переменных люди умудрялись через темповые объекты передаваться. Например через таблицы или сиквенсы.
1.б. на пл-перле или пл-tcl это (параметры сеанса) было возможно всегда.

2. В лоб. - ДДЛ в самой функции. (хотя и считается плохим тоном, но вот постгрес кажется умеет ддл в транзакции делать). чисто как экзотика, и только посмотреть, как же другие люди мучаются - рекомендую.

3. честно расписать весь каскад руками, с тем, чтобы не оставалось недомолвок, а вдруг там есть еще какие каскады, которых вам не надо.

4. думаю можно написать свою хранимку (не триггерную), явно вызывающую "системные" триггерные функции, а системно (т.е. триггерно) целостность не поддерживать (работать только через такие хранимки). Правда это надо пробовать. (можно ли вызвать тр.ф-ю селектом??? не пробовал). Примеры передачи параметров были известны в ПЖ 7.0 . Смотреть например тут:
http://sql.ru/forum/actualthread.aspx?tid=43527&pg=1&hl=create+constraint+trigger񇪺

(т.к. Пгадмин например не показывает параметров ф-й "RI_FKey_cascade_del" и т.п., а "они там есть" (ну, или были).
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35659688
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю 4. есть глупость . т.к. триггерной ф-ии надо передать триггерное же окружение (NEW OLD и т.п. переменные). иначе как в триггере оно недоступно. Т.е. если и дергать т-ф, то только внутри триггера (другой триггерной ф-ии).

Т.ч. п.4. вычеркиваем.
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35664985
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaPilot,

думаю, достаточно
1. создать ON DELETE CASCADE
2. довесить триггерок, бефоре делет, генерящий ошибку по вашему сложному условию.

+1. Сам признак можно хранить в темповой табличке и "не париться".

assaPilot,
(по любому - FK - это триггерок, но триггерок, реализуемый системой, т.ч. вряд ли стоит его дублировать самому. Особо -если каскады ветвистые. Но иногда таки имеет смысл.)
Это не совсем обычный триггерок. Ссылочная целостность не реализуема на триггерах в версионных СУБД. Для её поддержки НЕОБХОДИМО быть вне транзакций.
...
Рейтинг: 0 / 0
Каскадное удаление или запрет в завимости от параметра
    #35665276
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey DaeronassaPilot,
(по любому - FK - это триггерок, но триггерок, реализуемый системой, т.ч. вряд ли стоит его дублировать самому. Особо -если каскады ветвистые. Но иногда таки имеет смысл.)
Это не совсем обычный триггерок. Ссылочная целостность не реализуема на триггерах в версионных СУБД. Для её поддержки НЕОБХОДИМО быть вне транзакций.ну так я не сказал, что триггерок обычный, и ссылку дал на тему с
"CREATE CONSTRAINT TRIGGER"

за разъяснение спасибо.

ЗЫ
RTFMCREATE CONSTRAINT TRIGGER is used within CREATE TABLE/ALTER TABLE and by pg_dump to create the special triggers for referential integrity . It is not intended for general use.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное удаление или запрет в завимости от параметра
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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