我有一个包含 ID 和 ParentAccountID 的帐户表。以下是重现这些步骤的脚本。
如果 ParentAccountID 为 NULL,则该帐户被视为顶级帐户。
每个帐户最终应以顶级帐户结束,即 ParentAccountID 为 NULL
Declare @Accounts table (ID INT, ParentAccountID INT )
INSERT INTO @Accounts values (1,NULL), (2,1), (3,2) ,(4,3), (5,4), (6,5)
select * from @Accounts
-- Request to update ParentAccountID to 6 for the ID 3
update @Accounts
set ParentAccountID = 6
where ID = 3
-- Now the above update will cause circular reference
select * from @Accounts
当请求到来时,例如更新帐户的 ParentAccountID,如果这会导致循环引用,则在更新之前需要对其进行识别。
大家有什么想法吗?
看来您已经为您的表定义了一些业务规则:
您有两种方法可以强制执行此操作。
您可以创建一个trigger在您的数据库中,并检查触发器中的逻辑。这样做的好处是在数据库内部运行,因此它适用于每个事务,无论客户端如何。然而,数据库触发器并不总是流行。我将他们视为副作用,而且它们可能很难调试。触发器作为 SQL 的一部分运行,因此如果它们很慢,您的 SQL 也会很慢。
另一种方法是在应用程序层中强制执行此逻辑 - 无论与数据库通信的是什么。这更容易调试,并使您的业务逻辑对新开发人员来说是明确的 - 但它不在数据库内运行,因此如果您有多个客户端应用程序,您最终可能会复制逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)