Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер на update поля в таблице с SubReference  [new]
Rurk
Member

Откуда:
Сообщений: 186
Есть таблица CatDebit (ID_CatDebit int, ID_CatDebitPre int, CatDebitName nvarchar(255), NotCalc bit default 0)
представляющая собой дерево до 3 уровня (Связь по полям ID_CatDebit, ID_CatDebitPre)
Нужно написать триггер, который бы при update поля NotCalc update-ил это поле во всех записях, являющихся дочерними
Попробовал так:

CREATE TRIGGER tr_CatDebit_upd ON [dbo].[CatDebit]
FOR UPDATE
AS
update CatDebit set NotCalc = i.NotCalc
from CatDebit CD join inserted i on CD.ID_CatDebitPre = i.ID_Catdebit
where dbo.kf_CatDebitLevel(CD.ID_CatDebit) = dbo.kf_CatDebitLevel(i.ID_CatDebit) + 1

где dbo.kf_CatDebitLevel(CD.ID_CatDebit) - функция возвращающая уровень записи CatDebit, но update-ится только 1 уровень.
Можно что-нить придумать?
4 мар 05, 11:28    [1362703]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update поля в таблице с SubReference  [new]
StalkerS
Member

Откуда: Nowhere
Сообщений: 1343
Задача поиска детей в дереве. Не сильно тривиальная, но в данном случае, т.к. вложенность не превышает 3, можно не заморачиваться,
а решить ее в лоб. А вообще, для общего развития почитай теорию графов в sql.

-- table tree(parent int, child int)

-- @elem - значение, с которого начинаем искать детей


declare @elem int

select @elem=1

select @elem
union
select child from tree where parent=@elem
union
select child from tree where parent in (select child from tree where parent=@elem)
4 мар 05, 12:42    [1363188]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update поля в таблице с SubReference  [new]
Serbat_Ivan
Member

Откуда: SQL.RU
Сообщений: 1603
Если до N-ного уровня - без рекурсии не обойтись, а до 3-его можно и в лоб.
Присоединяюсь к StalkerS см. выше :)
4 мар 05, 12:47    [1363220]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update поля в таблице с SubReference  [new]
StalkerS
Member

Откуда: Nowhere
Сообщений: 1343
можно обойтись без рекурсии. В частности, метод Селко.

Но мне очень нравиться вот этот алгоритм :


declare @elem int, @level int
select @elem=1, @level=0 -- @elem - элемент, с которого начинаем поиск подузлов

declare @wave table (parent int null, child int null, level int)

insert into @wave
select *, @level
from tree
where child=@elem

while @@rowcount>0
begin

select @level=@level+1

insert into @wave
select t.parent, coalesce(t.child,w.parent), @level
from @wave w
left join tree t on w.parent=t.child
where w.level=@level-1 and w.parent is not null

end

select distinct child from @wave


работает необычайно быстро и без рекурсии
4 мар 05, 13:00    [1363306]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update поля в таблице с SubReference  [new]
Rurk
Member

Откуда:
Сообщений: 186
Как найти дочерние записи, я знаю.
Я не могу написать update в котором бы можно учесть, что одновременно может апдейтится несколько записей, для 1 могу, а для нескольких нет
4 мар 05, 14:16    [1363797]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на update поля в таблице с SubReference  [new]
StalkerS
Member

Откуда: Nowhere
Сообщений: 1343
что вы нас, уважаемый путаете ? Ты же сам написал:

>>который бы при update поля NotCalc update-ил это поле во всех записях, являющихся дочерними
...
>>функция возвращающая уровень записи CatDebit, но update-ится только 1 уровень.

Про несколько записей тут ничего не написано ;)

Если ты имеешь в виду случай, когда одним запросом апдейтится сразу несколько записей, так открой курсор, наподобие этого :


CREATE TRIGGER [tr1] ON dbo.tree
FOR UPDATE
AS

declare @elem int
declare @t varchar(10)

declare cur cursor for select parent,t from inserted
open cur
fetch next from cur into @elem, @t

while @@fetch_status=0
begin

update tree set t=@t where child in
(select @elem
union
select child from tree where parent=@elem
union
select child from tree where parent in (select child from tree where parent=@elem))


fetch next from cur
end

close cur
deallocate cur


хотя я может опять тебя неправильно понял ;)
4 мар 05, 16:33    [1364670]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить