Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вычисление способа удаления внутри триггера / 5 сообщений из 5, страница 1 из 1
19.12.2014, 19:17:47
    #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
24.12.2014, 10:49:13
    #38841385
NikolayV81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисление способа удаления внутри триггера
judas777,

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

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

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

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

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

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


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