Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное обновление значений / 6 сообщений из 6, страница 1 из 1
16.06.2014, 15:58:36
    #38670648
Electric200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
Добрый день уважаемые.
Собственно, есть задача и пока думаю с какой стороны к ней подойти.
Собственно на пальцах:
Есть таблица USER. В ней к примеру есть столбцы.
USERID - OWNERID

OWNERID содержит USERID родителя, если это чаелд.
Собственно, заложена неограниченная иерархия и также неограниченно количество разветвлений. Т.е любой чаелд, при создание свое чаелда, стает родителем. Количество чаелд у родителя не ограничено.

Есть вторая таблица «RULE_LIST». USERID – RULE1 – RULE2 - RULE3

И вот задача, если USER меняет какое то правило меняется с true на false, то значение это правила, также должно каскадно поменятся у всех его чаелдов, также потомков это чаелда, и путомков потомков.
При этом, если с false на true то рекурсивно менять не нужно.

Конечно, можно циклами, но может есть какой то более гуманный способ?
Заранее благодарен!
...
Рейтинг: 0 / 0
16.06.2014, 17:15:08
    #38670747
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
С помощью триггера. В функции использовать рекурсивный запрос для получения множества id, по которым выполнить обновление, все это делается одним запросом.
...
Рейтинг: 0 / 0
16.06.2014, 17:19:32
    #38670756
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
Electric200,

сделайте триггер на обновление "правила" для родителя, который обновит потомков первого уровня, дальше он сам себя рекурсивно будет вызывать, если есть потомки следующих уровней. Что на что меняется, прямо в триггере и проверяйте.
...
Рейтинг: 0 / 0
17.06.2014, 13:44:46
    #38671740
Electric200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
Спасибо за совет. Действительно, все обошлось тригером.
...
Рейтинг: 0 / 0
17.06.2014, 15:37:22
    #38671932
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
блиин быстрее надо на эту субд переходить, у меня таблица директории(дерево) и надо каскадно менять размер папки....
на мускле, раз тригер на таблицу папки, из него нельзя поменять эту же таблицу. приходиться использовать промежуточную.
...
Рейтинг: 0 / 0
17.06.2014, 19:40:36
    #38672321
Electric200
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каскадное обновление значений
Ну у мены вышло так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
CREATE TRIGGER acl_update_child AFTER UPDATE 
ON public."USER_ACL_LIST" FOR EACH ROW 
EXECUTE PROCEDURE public.acl_update_child();

CREATE OR REPLACE FUNCTION public.acl_update_child (
)
RETURNS trigger AS
$body$
DECLARE
hstore_new hstore;
hstore_old  hstore;
rec_user    RECORD;
st             RECORD;
query        TEXT;


  

BEGIN

 hstore_new =  hstore(NEW);
 hstore_old   =  hstore(OLD);
 
 --GET CHILD USER
 FOR rec_user IN SELECT "ID" FROM "USER_LIST" WHERE "OWNERID"=NEW."USERID" 
 LOOP
 	 FOR st IN SELECT * FROM  EACH(hstore_new)
     LOOP
      	IF hstore_old->st.key != st.value AND st.value = 'f' THEN
           query = 'UPDATE "USER_ACL_LIST" SET ' || quote_ident(st.key) || ' = false WHERE "USERID" = '|| rec_user."ID";
           EXECUTE (query);
        END IF;
     END LOOP;
 END LOOP;
RETURN NEW; 
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


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


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