Как создать триггер

Я использую SQL Server 2000. Здесь находится таблица с древовидной структурой.

tItem
   ItemID int keyfield,
   ParentItemID int,
   Title nvarchar 200,
   ChildCount int,
   Status int

Мне нужно рассчитать триггер ChildCount и Status. Когда я вставляю один элемент, родительский элемент должен вычислять количество и статус дочерних элементов. 0 ‹ статус ‹ 100

Рассчитайте родительский статус, если у родителя есть 2 дочерних элемента, суммируйте дочерний статус, а затем разделите количество дочерних элементов. пример: 80+100/2 Эта операция рекурсивная по отношению к корневому родителю. Например:

До :

Project Child=1, Status=80 
|-Module  Child=1, Status=80
| |-Control Child=0, Status=80

После вставки элемента формы

Project Child=1, Status=90      // 3 Calculate child and status
|-Module  Child=2, Status=90    // 2 Calculate child and status
| |-Control Child=0, Status=80 
| |-Form  Child=0, Status=100   // 1 First. inserted row

Этот пример имеет 3 уровня. Возможно, уровень структуры дерева моей таблицы больше 32.

Как создать этот триггер?


person ebattulga    schedule 18.02.2009    source источник


Ответы (2)


Я думаю, вы должны быть в состоянии использовать это:

create trigger on tItem after insert or update as
if (inserted.ParentItemID is not null)
    update tItem set ChildCount = (select count(1) from tItem where ParentItemID=ItemID)
    where ItemID = inserted.ParentItemID
    -- calculate status here
go

Это должно, если у меня все еще есть все мои шарики, запускать и обновлять ChildCount родителя, который, в свою очередь, снова запускает тот же триггер и обновляет ChildCount родителя до тех пор, пока у него не закончатся родители для обновления.

Тем не менее, я бы настоятельно предложил вам использовать представление или хранимую процедуру для динамического расчета — не рекомендуется хранить данные такого рода статически, если ваша таблица не будет активно читаться. по другим запросам.

person Fritz H    schedule 18.02.2009
comment
если мой уровень дерева таблицы больше 32, ошибка выпуска mssql. потому что триггер mssql не вызывает больше 32. - person ebattulga; 18.02.2009
comment
+1 за альтернативные решения. В частности, я думал о представлениях - так безопаснее. И если бы я продолжил решение с триггером, я бы скорее определил два из них, один для количества, другой для состояния. - person Andriy M; 28.01.2011

Вы должны иметь возможность вызывать UDF в своем триггере для каждой вставленной строки.

В качестве альтернативы, если дерево управляемо и изменяется нечасто, вы можете вызвать SP для пересчета всего дерева после любой вставки.

Кроме того, в вашем примере, почему корневой статус не меняется на 90, когда его единственный дочерний статус изменился на 90?

person Cade Roux    schedule 18.02.2009