如何创建触发器

时间:2009-02-18 02:28:11

标签: sql-server tsql triggers

我正在使用sql server 2000.我的Tree结构表就在这里

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

我需要计算ChildCount和Status触发器。当我插入一个项目时,父项目必须计算子计数和状态。 0<状态< 100

计算父母身份,如果父母有2个孩子,则计算子女孩身份,然后除以子女数。例如:80 + 100/2 此操作可以重复使用root父级。例如:

之前:

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

如何创建此触发器?

2 个答案:

答案 0 :(得分:1)

我认为你应该可以使用它:

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,直到父母用完为止。

但是,我强烈建议您更愿意使用视图或存储过程来动态计算这些数据 - 除非您的表格要用于静态存储此类数据,否则不是一个好主意被其他查询严重阅读。

答案 1 :(得分:1)

您应该能够在触发器中为插入的每一行调用UDF。

或者,如果树是可管理的并且不经常更改,则可以在插入任何插入后调用SP以重新计算整个树。

此外,在您的示例中,为什么当其唯一孩子的状态已更改为90时,根状态是否会更改为90?