gpt4 book ai didi

sql - 触发器以防止 sql 树中的无限循环

转载 作者:行者123 更新时间:2023-12-01 13:08:34 25 4
gpt4 key购买 nike

我有包含 (NodeId, NodeName) 的节点表和结构表 (ParentNodeId, ChildNodeId)。我如何编写一个触发器来检查插入更新或删除语句是否会导致无限关系?

最佳答案

这是我的解决方案,到目前为止它按预期工作。

CREATE TRIGGER [dbo].[CheckNodeDependence] ON [dbo].[ObjectTrees]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON

DECLARE @CTable TABLE(ChildId INT NOT NULL,
ParentId INT NOT NULL,
[Level] INT NOT NULL,
RowId INT NOT NULL)

DECLARE @Level INT
SET @Level = 1

DECLARE @rows_affected INT
SET @rows_affected = 1

INSERT INTO @CTable
SELECT ObjectId, ParentId, 1, ObjectId FROM INSERTED

WHILE @rows_affected > 0
BEGIN
SET @Level = @Level + 1
INSERT INTO @CTable
SELECT T.ObjectId, T.ParentId, @Level, C.RowId
FROM ObjectTrees T
INNER JOIN @CTable C ON T.ParentId = C.ChildId
AND C.Level = @Level - 1

SET @rows_affected = @@rowcount
IF EXISTS(
SELECT * FROM @CTable B
INNER JOIN @CTable V ON B.level = 1
AND V.Level > 1
AND V.RowId = B.RowId
AND V.ChildId = B.RowId)
BEGIN
DECLARE @error_message VARCHAR(200)
SET @error_message = 'Operation would cause illegal circular reference in tree structure, level = ' + CAST(@Level AS VARCHAR(30))
RAISERROR(@error_message,16,1)
ROLLBACK TRANSACTION
RETURN
END
END
END
GO

关于sql - 触发器以防止 sql 树中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com