我有一个包含IDParentIDHierarchy列的树表,并希望生成依赖HierarchyParentID列值。为此,我使用触发器。是否存在更好的方法来生成层次结构列值?

ALTER TRIGGER [TR_MyTable_BeforInsert] ON [MyTable]
INSTEAD OF INSERT
AS BEGIN
SET NOCOUNT ON;
Declare @Name NVarChar(100),
        @ParentID Int

Declare DACategory Cursor For
Select  A.Name, A.ParentID
From    Inserted A
OPEN    DACategory
FETCH NEXT FROM DACategory INTO @Name, @ParentID
While @@FETCH_STATUS=0 Begin

    Insert Into MyTable (Name, ParentID, Hierarchy)
    Values (@Name, @ParentID, dbo.F_MyTableGetHID(NULL, @ParentID))

    FETCH NEXT FROM DACategory INTO @Name, @ParentID
End
Close   DACategory
Deallocate DACategory
END

功能 :
ALTER FUNCTION [F_MyTableGetHID]
(
    @ID int,
    @ParentID int
)
RETURNS HierarchyID

AS BEGIN
    Declare @RootHID HierarchyID,
            @LastHID HierarchyID

    IF (@ParentID IS NULL)Begin
        Set @RootHID = HierarchyID::GetRoot()
        Select @LastHID = Max(Hierarchy) From MyTable Where ParentID IS NULL
    End Else Begin
        Select @RootHID = Hierarchy From MyTable Where ID = @ParentID
        select @LastHID = Max(Hierarchy) From MyTable where ParentID = @ParentID
    End
    return @RootHID.GetDescendant(@LastHID, NULL)
END

对于更新,此表还具有触发器,可以在ParentID更改时再次设置“层次结构”列。

解决此问题的最佳做法是什么?

编辑1 :我在可能的情况下查找不使用触发器的解决方案。

最佳答案

我有不同的方法来回答这两个问题。我通常避免使用触发器,直到它成为最后的选择为止,因为它会增加数据库上不必要的开销。

触发器与存储过程之间的比较

  • 很容易查看表关系,约束,索引,存储
    数据库中的过程,但触发器很难查看。
  • 触发器对客户端应用程序应用程序不可见。他们
    不可见或可以在调试代码中跟踪。
  • 如果没有文档,很容易忘记触发器
    对于新的开发人员来说,很难弄清楚他们的
    存在。
  • 触发器每次在数据库字段被更新时运行,并且它
    是系统的开销。它使系统运行速度变慢。

  • 足够说了,这就是为什么我更喜欢存储过程。您可以通过代理创建作业文件(例如ex:每30分钟或任何其他时间执行一次)。您可以使用该逻辑在该作业文件中插入。这样,您在tree table中的数据将接近实时。

    现在引用创建代理:
    http://msdn.microsoft.com/en-us/library/ms191128(v=sql.90).aspx
    http://msdn.microsoft.com/en-us/library/ms181153(v=sql.105).aspx

    关于sql - 自动生成层次结构值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11381537/

    10-13 08:37