Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / bug не запуска триггера на удаление подчиненки при каскадном удалении / 4 сообщений из 4, страница 1 из 1
02.02.2005, 15:51
    #32897397
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bug не запуска триггера на удаление подчиненки при каскадном удалении
Есть 2 таблички tree и leaf связанные 1-1, с условием каскадного удаления
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE public.leaf
(
  id int4 NOT NULL,
...
...
  value float8,
  CONSTRAINT leaf_pkey PRIMARY KEY (id),
  CONSTRAINT company_leaf FOREIGN KEY (company) REFERENCES public.company (id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT tl_id FOREIGN KEY (id) REFERENCES public.tree (id) ON UPDATE CASCADE ON DELETE CASCADE
на табличку leaf пишу триггера:
Код: plaintext
1.
2.
3.
4.
5.
CREATE TRIGGER leaf_delete_values
  AFTER DELETE
  ON public.leaf
  FOR EACH ROW
  EXECUTE PROCEDURE public.tr_delete_leaf_values();
и т.п. (на полный набор действий) - т.е. реализуется некая денормализация, - триггера заполняют (пересчитывают) таблицу рез-тов при вводе данных.

Далее тестирую:
Код: plaintext
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.
CREATE TABLE test_before_insert AS 
SELECT DISTINCT  t_values.* FROM t_values
INNER JOIN t_parents ON tid = pid 
WHERE id =  19831  OR pid =  19831 ;


INSERT INTO tree 
(id, pid, pos, uname_create, uname_modify, date_create, date_modify, status )
 VALUES 
(- 18 ,  19831 , - 18 ,'test','test',  1050131 ,  1050131 , - 1  );

INSERT INTO leaf 
(id,  company, kind, date, name, description, search_name, currency, value, payment_kind, planfact )

VALUES 
(- 18 ,   2 ,  1 ,  1050131 , 'test_insert', 'test_insert', 'test_insert',  0 ,  1 , -  1  ,  1  );

CREATE TABLE test_past_insert AS 
SELECT  DISTINCT t_values.* FROM t_values
INNER JOIN t_parents ON tid = pid 
WHERE id =  19831  OR pid =  19831 ;

/*
DELETE FROM leaf WHERE id = -18; 
*/
DELETE FROM tree WHERE id = - 18 ; --каскад


CREATE TABLE test_past_delete AS 
SELECT  DISTINCT  t_values.* FROM t_values
INNER JOIN t_parents ON tid = pid 
WHERE id =  19831  OR pid =  19831 ;


и проверяю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT b.*, b.value - p.value AS delt FROM

test_before_insert b
--test_past_insert b

RIGHT JOIN 

--test_past_insert p
test_past_delete p

USING (tid ,  payment_kind ,  planfact ,  currency ,  ayear ,  amonth )
WHERE
  b.value - p.value <>  0  OR b.value IS NULL
;
Получаю, что если при тесте для удаления из leaf пользовался каскадом (как приведено - строка DELETE FROM leaf WHERE id = -18; заккоментирована), то идентичны наборы test_past_insert и test_past_delete,

если же явно выполняю сначала DELETE FROM leaf WHERE id = -18; (т.е. удаляю не каскадным триггером), то идентичны test_before_insert и test_past_delete

(с точностью до числовой диффузии при расчете - ибо поля флоат, а округления я (пока) не делаю).

т.е., получается, что запускаемое каскадным триггером (на удаление в tree) удаление в leaf не запускает триггера TRIGGER leaf_delete_values AFTER DELETE?

Версия 7.3.4

Кто сталкивался с подобным?



ЗЗЗЫ понимаю, что не самый очевидный тестовый материал, можно набросать много проще, но туго со временем. Хотя если баг подтвердится, придется срочно рожать методы гарантированного обхода (то ли отказываться от каскада, то ли дополнительно явно вызывать ф-ю -аналог триггерной в подчиненке на событии удаления из главной. Как при этом не задвоить изменения???.
...
Рейтинг: 0 / 0
02.02.2005, 16:23
    #32897507
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bug не запуска триггера на удаление подчиненки при каскадном удалении
кстати только у меня поиск на
http://archives.postgresql.org/pgsql-bugs/
не работает?

>>Can not connect to search daemon
...
Рейтинг: 0 / 0
02.02.2005, 17:12
    #32897670
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bug не запуска триггера на удаление подчиненки при каскадном удалении
на вскидку - трабла где-то в другом месте (или в большем количестве факторов) - создал тестовую ситуацию:
Код: plaintext
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.
CREATE TABLE public.main
(
  m_id serial NOT NULL,
  m_name varchar( 128 ),
  CONSTRAINT m_id_pkey PRIMARY KEY (m_id)
) WITHOUT OIDS;


CREATE TABLE public.main_add
(
  a_id int4 NOT NULL,
  a_name varchar( 128 ),
  CONSTRAINT a_id_pkey PRIMARY KEY (a_id),
  CONSTRAINT ma_id_fkey FOREIGN KEY (a_id) REFERENCES public.main (m_id) ON UPDATE CASCADE ON DELETE CASCADE
) WITHOUT OIDS;

CREATE OR REPLACE FUNCTION public.tr_test()
  RETURNS trigger AS
'DECLARE
 olid int4;
BEGIN
SELECT INTO olid OLD.a_id;

RAISE NOTICE \'Oid here is %\',  olid ;
RETURN OLD;
END;'
  LANGUAGE 'plpgsql' IMMUTABLE;

CREATE TRIGGER tr_test
  AFTER DELETE
  ON public.main_add
  FOR EACH ROW
  EXECUTE PROCEDURE public.tr_test();

проверяю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DELETE FROM main_add 
WHERE 
  a_id =  11 ; 

NOTICE:  Oid here is  11 

DELETE FROM main
WHERE 
  m_id =  10 ; 

NOTICE:  Oid here is  10 
т.ч. тут триггер запускается каскадом.

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

Правда у меня и на главную есть триггера.
...
Рейтинг: 0 / 0
02.02.2005, 17:43
    #32897768
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bug не запуска триггера на удаление подчиненки при каскадном удалении
САМ ДУРАК. (сыплю пепел голва).

траблов в постгресе нет.
Трабла в логике счета результатов и очередности запуска триггеров в главной и подчиненной. На момент запуска триггера на удаление в подчиненной, записей в "опорной" табличке расчета по иерархии, которая поддерживается в актуальном состоянии триггерами в главной уже нет (если запускать удаление в главной). Только и всего.

Буду думать, как выкручиваться (как получить в триггере подчиненной таблицы записи опорной таблички, токмо что (в этой же транзакции) удаленные триггером главной, или, вернее, как увидеть записи опорной таблицы на момент начала транзакции а не на момент выполнения триггера).


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


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