Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непонятки с тригером на удаление.  [new]
Wombat
Guest
Коллеги, есть задачка: имеется таблица, содержащая древовидную иерархию сущностей. Связь child-parent осуществляется через поле parent_id. На удаление сущности этой таблицы написан триггер вида

alter trigger tr_delete_cat on [dbo].[TABLE]
for delete
as
delete from dbo.TABLE
where [parent_id] in (select [id] from deleted)

Проблема в том, что при удалении удаляется выбраная сущность, ее потомки, но потомки потомков остаются.

Подскажите дураку - в чем проблема?
15 сен 04, 07:42    [959810]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
while 	(exists	(SELECT * FROM dbo.TABLE UM LEFT OUTER JOIN dbo.TABLE PUM ON UM.ParentID = PUM.ID 
                            WHERE (UM.ParentID IS NOT NULL) AND (PUM.ID IS NULL)
		)	
	) begin
	delete M
	from dbo.TABLE M, 
		(SELECT UM.ID FROM dbo.TABLE UM LEFT OUTER JOIN dbo.TABLE PUM ON UM.ParentID = PUM.ID 
                            WHERE (UM.ParentID IS NOT NULL) AND (PUM.ID IS NULL)
		) IM
	WHERE M.ID=IM.ID
end

либо nested triggers [\/]
15 сен 04, 07:56    [959818]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
поставить галку CASCADE DELETE на таблицу потомков потомков в связи.

или в триггере написать удаление.


для спящего время бодрствования равносильно сну
15 сен 04, 08:09    [959833]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
Врочем, я наверное слишком на свою структуру ориентировался, можно так:

alter trigger tr_delete_cat on [dbo].[TABLE]
for delete
as

select id INTO #deleted FROM dbo.TABLE where [parent_id] in (select [id] from deleted)

delete from dbo.TABLE
where [parent_id] in (select [id] from deleted)

while @@ROWCOUNT>0 begin

INSERT #deleted (id)
Select id FROM dbo.TABLE where [parent_id] in (select [id] from #deleted )

delete from dbo.TABLE
where [parent_id] in (select [id] from #deleted)

end

DROP TABLE #deleted
15 сен 04, 08:11    [959838]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2aleks2
а зачем так сложно все???

delete p2 from deleted d
 join potom1 p1 on p1.parentid = d.id
 join potom2 p2 on p2.parentid = p1.id

delete p1 from deleted d
 join potom1 p1 on p1.parentid = d.id
и все.

для спящего время бодрствования равносильно сну
15 сен 04, 08:16    [959844]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
ааа... не прочитал...
сорри.

для спящего время бодрствования равносильно сну
15 сен 04, 08:17    [959845]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
Гм, вот ведь блин - все равно неправильно...

Ну вот так:

alter trigger tr_delete_cat on [dbo].[TABLE]
for delete
as

declare @t Table(id int)

INSERT @t (id)
select id FROM dbo.TABLE where [parent_id] in (select [id] from deleted)

while @@ROWCOUNT>0 begin
INSERT @t (id) Select id FROM dbo.TABLE where [parent_id] in (select [id] from @t)
end

delete from dbo.TABLE
where [parent_id] in (select [id] from @t)
15 сен 04, 08:22    [959851]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
Ну и совсем красиво
alter trigger tr_delete_cat on [dbo].[TABLE] 
for delete 
as

declare @t Table(id int, UNIQUE(id))

INSERT @t (id)
select id FROM dbo.TABLE where [parent_id] in (select [id] from deleted)

while @@ROWCOUNT>0 begin
  INSERT @t (id) 
  Select id FROM dbo.TABLE T LEFT OUTER JOIN @t tt ON T.ID=tt.id 
  where tt.id is null and exists(select * from @t x WHERE x.id=T.[parent_id] )
end

delete from dbo.TABLE 
where [parent_id] in (select [id] from @t)
15 сен 04, 08:28    [959861]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
Wombat
Guest
Товарищи, перебором по курсору или тмп таблице я и сам могу удалять :) Но перебор то - плохой тон типа.
Почему конструкция, которая должна работать, не работает - вот в чем вопрос. Видимо я чтото не понимаю в логие sql машины. Но вот что имеенно?:)
15 сен 04, 09:41    [960003]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
Триггер не вызывает сам себя.
15 сен 04, 09:49    [960034]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
aleks2
Guest
А даже и вызывал бы, так на 32 потомке споткнется...
15 сен 04, 09:50    [960042]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
Wombat
Guest
т.е. удаление чего либо в тригере не приодит к вызову тригера на удаление?
15 сен 04, 10:00    [960079]     Ответить | Цитировать Сообщить модератору
 Re: Непонятки с тригером на удаление.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Если стоит галка Allow triggers to be fired which fire other triggers (nested triggers). очень даже приводит... но... ограничения на глубину рек 32, как сказано выше...
15 сен 04, 10:49    [960313]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить