Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
Есть нужда создать функцию (желательно на plpgsql) для удаления строк из таблицы. Функция должна в зависимости от значения входного параметра либо удалять зависимые записи (т.е. делать каскадное удаление), либо при обнаружении зависимых записей валиться с ошибкой и ничего не удалять. Есть возможность такое сотворить? Пока в голову ничего умнее Код: plaintext 1. 2. 3. Хочется придумать решение получше. Нет ли возможности заставить PostgreSQL воспринимать констрейнты то как "on delete cascade", то как "on delete restrict" в зависимости от входного параметра в функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2008, 17:38 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
Pilot, думаю, достаточно 1. создать ON DELETE CASCADE 2. довесить триггерок, бефоре делет, генерящий ошибку по вашему сложному условию. (по любому - FK - это триггерок, но триггерок, реализуемый системой, т.ч. вряд ли стоит его дублировать самому. Особо -если каскады ветвистые. Но иногда таки имеет смысл.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 11:19 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
Не, так не пойдет. Сама задача ведь откуда взялась - в пользовательском интерфейсе возле кнопки "Удалить запись" есть галочка "удалять зависимые объекты". В зависимости от этой галочки мне и нужно либо выполнить каскадное удаление, либо при обнаружении зависимых записей валиться с ошибкой. Триггер тут не подходит из-за того, что он не сможет учесть флаг каскадного удаления, который подается на вход пользовательской функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 11:32 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
PilotТриггер тут не подходит из-за того, что он не сможет учесть флаг каскадного удаления, который подается на вход пользовательской функции. сможет. в функции устанавливайте переменную, например custom.do_cascade_delete = true, а в тригере - проверяйте её: Код: plaintext 1. 2. 3. 4. 5. 6. что бы это работало нужно что бы в postgresql.conf в custom_variable_classes было custom, типа: custom_variable_classes = 'plperl,plperlu,custom' + что бы не обрабатывать исключение (ERROR: не распознанный параметр конфигурации: "custom.do_cascade_delete") - я бы ещё задал значение по умолчанию для этой переменной (в конце postgresql.conf): custom.do_cascade_delete = false ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2008, 13:53 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
Доступа к администрированию сервера PostgreSQL у меня нет. Я пока не знаю, что там в файле настроек. Сществует ли другой способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 09:41 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
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" и т.п., а "они там есть" (ну, или были). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:38 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
думаю 4. есть глупость . т.к. триггерной ф-ии надо передать триггерное же окружение (NEW OLD и т.п. переменные). иначе как в триггере оно недоступно. Т.е. если и дергать т-ф, то только внутри триггера (другой триггерной ф-ии). Т.ч. п.4. вычеркиваем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2008, 10:45 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
assaPilot, думаю, достаточно 1. создать ON DELETE CASCADE 2. довесить триггерок, бефоре делет, генерящий ошибку по вашему сложному условию. +1. Сам признак можно хранить в темповой табличке и "не париться". assaPilot, (по любому - FK - это триггерок, но триггерок, реализуемый системой, т.ч. вряд ли стоит его дублировать самому. Особо -если каскады ветвистые. Но иногда таки имеет смысл.) Это не совсем обычный триггерок. Ссылочная целостность не реализуема на триггерах в версионных СУБД. Для её поддержки НЕОБХОДИМО быть вне транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 11:22 |
|
||
|
Каскадное удаление или запрет в завимости от параметра
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2008, 12:37 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35659688&tid=2003869]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
6ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 378ms |

| 0 / 0 |
