powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное обновление значений
6 сообщений из 6, страница 1 из 1
Каскадное обновление значений
    #38670648
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день уважаемые.
Собственно, есть задача и пока думаю с какой стороны к ней подойти.
Собственно на пальцах:
Есть таблица USER. В ней к примеру есть столбцы.
USERID - OWNERID

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

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

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

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

сделайте триггер на обновление "правила" для родителя, который обновит потомков первого уровня, дальше он сам себя рекурсивно будет вызывать, если есть потомки следующих уровней. Что на что меняется, прямо в триггере и проверяйте.
...
Рейтинг: 0 / 0
Каскадное обновление значений
    #38671740
Electric200
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за совет. Действительно, все обошлось тригером.
...
Рейтинг: 0 / 0
Каскадное обновление значений
    #38671932
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блиин быстрее надо на эту субд переходить, у меня таблица директории(дерево) и надо каскадно менять размер папки....
на мускле, раз тригер на таблицу папки, из него нельзя поменять эту же таблицу. приходиться использовать промежуточную.
...
Рейтинг: 0 / 0
Каскадное обновление значений
    #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
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Каскадное обновление значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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