列 を持つツリー テーブルがあり、にID
依存する列値を生成したいと考えています。この目的のために、トリガーを使用します。階層列の値を生成するより良い方法はありますか?ParentID
Hierarchy
Hierarchy
ParentID
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
変更時に階層列を再度設定するトリガーもあります。
この問題のベストプラクティスは何ですか?
EDIT 1 :可能であればトリガーを使用しないソリューションを探します。