powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вычисление способа удаления внутри триггера
5 сообщений из 5, страница 1 из 1
Вычисление способа удаления внутри триггера
    #38838460
judas777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые гуру !
В связи со скудностью информации по PostgreSQL на понятном языке, вынужден обращаться к Вам за помощью
---------------
Стоит задача блокирования возможности физического удаления записей в таблицах базе данных НО с возможностью чистки таблиц. С целью реализации такого способа удаления, в каждую таблицу БД было введено поле "валидность" строки которое принимает одно из двух значений Y - запись видно в приложении, N-запись не видно в приложении (отфильтровывается в запросах).
Технология простенькая но возникает проблема с подчинёнными (detail) таблицами, которые имею очень "ветвистую структуру".
По умолчанию написан следующий "скелет" триггерной функции

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION transaction_delete()
  RETURNS trigger AS
$BODY$
 DECLARE id integer;  
BEGIN
 --если удаляется строка с признаком невалидности, значит чистят БД -> удаляем физически 
 IF  OLD.valid='N' THEN 
    RETURN OLD;   
  END IF;
  -- иначе ручное удаление.
  -- отмечаем текущую запись признаком НЕ ВАЛИДНА
  EXECUTE 'UPDATE '||TG_TABLE_SCHEMA||'."'||TG_TABLE_NAME||'" SET valid=''N'' WHERE id='||OLD.id; 
  -- возвращаем "пустышку" для блокировки удаления
  RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



Проблема:
При удалении материнской записи в первый раз, она отмечается признаком valid=N, действие по удалению блокируется что приводит к тому, что тригерры в подчинённых таблицах просто не срабатывают. При повторном удалении - тригерр в подчинённой таблице срабатывает впервые и "ставит" признак невалидности подчинённой записи, а "внучатая" запись пока не знает что "выше" происходит удаление.

Вопрос:
Каким образом сгенерировать событие "удаление" для подчинённых записей таблицы, без самого удаления материнской записи.
...или подскажите какую то иную технологию выхода из ситуации.
Сразу оговорюсь, проверка ссылочных полей не прокатывает по простейшей причине - связи между таблицами очень сложные и не всегда зависят от простого отношения master-Detail

буду благодарен за любую мысль на эту тему
...
Рейтинг: 0 / 0
Вычисление способа удаления внутри триггера
    #38841385
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
judas777,

Заведите отдельного пользователя для чистки и не мучайтесь
...
Рейтинг: 0 / 0
Вычисление способа удаления внутри триггера
    #38842063
judas777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NikolayV81judas777,

Заведите отдельного пользователя для чистки и не мучайтесь
Николай, проблема не в пользователе, а в том, чтоб если нужно удалить строку БД нужно вырубать триггеры.
Встречный вопрос.
Каким образом получить полный перечень активных (ENABLED) триггеров для таблицы ?
...
Рейтинг: 0 / 0
Вычисление способа удаления внутри триггера
    #38842085
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
judas777,

NikolayV81 имеет ввиду следующее:
запретить удалять всем пользователем, кроме специально обученного.
Т.о. в триггере можно проверять пользователя, а на "valid".
(Кстати, прикинте, что произойдет, когда два пользователя откроют табличку, сходят покурить, а затем почереди нажмут удалить?)
Продолжаю про пользователя: если привелигированный удаляет - удаляем, нет обновляем.
...
Рейтинг: 0 / 0
Вычисление способа удаления внутри триггера
    #38842092
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gold_judas777,

NikolayV81 имеет ввиду следующее:
запретить удалять всем пользователем, кроме специально обученного.
Т.о. в триггере можно проверять пользователя, а на "valid".
(Кстати, прикинте, что произойдет, когда два пользователя откроют табличку, сходят покурить, а затем почереди нажмут удалить?)
Продолжаю про пользователя: если привелигированный удаляет - удаляем, нет обновляем.

я так понял пометка в принципе вводилась длч того что-бы решить проблему удаления не в том месте, если так, то просто забираем права на удаление у таблиц у всех пользователей кроме userwhocandeleterecords ( можно просто роль, которая по дефолту будет вырублена ), при необходимости "почистить" делаем второй коннект нужным пользователем ( подключаем роль ) и удаляем.

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


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