Sql server 如何创建触发器

Sql server 如何创建触发器,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我使用的是sql server 2000。我的树结构表在这里 tItem ItemID int keyfield, ParentItemID int, Title nvarchar 200, ChildCount int, Status int 我需要计算ChildCount和状态触发器。当我插入一项时,父项必须计算子项计数和状态。0

我使用的是sql server 2000。我的树结构表在这里

tItem
   ItemID int keyfield,
   ParentItemID int,
   Title nvarchar 200,
   ChildCount int,
   Status int
我需要计算ChildCount和状态触发器。当我插入一项时,父项必须计算子项计数和状态。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


如何创建此触发器?

我认为您应该能够使用此触发器:

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,直到父对象的ChildCount用完为止


但是,我强烈建议您使用视图或存储过程来动态计算这些数据-静态存储这种性质的数据不是一个好主意,除非您的表将被其他查询大量读取。

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

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


另外,在您的示例中,当其唯一子级的状态更改为90时,为什么根状态不更改为90?

如果我的表树级别大于32,则mssql释放错误。因为mssql触发器不会调用大于32.+1的替代解决方案。特别是我一直在考虑视图,这样看起来更安全。如果我继续使用触发器解决方案,我宁愿定义其中两个,一个用于计数,另一个用于状态。