【问题标题】:How to create trigger如何创建触发器
【发布时间】:2010-10-08 06:14:35
【问题描述】:

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

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

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

如果父母有 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

如何创建这个触发器?

【问题讨论】:

    标签: sql-server tsql triggers


    【解决方案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,直到没有父级来更新。

    p>

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

    【讨论】:

    • 如果我的表树级别大于 32,mssql 释放错误。因为 mssql 触发器不会调用大于 32。
    • +1 用于替代解决方案。特别是我一直在考虑观点 - 这样似乎更安全。如果我继续使用触发器解决方案,我宁愿定义其中两个,一个用于 Count,另一个用于 Status。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 2014-02-02
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多