【发布时间】:2021-05-20 19:40:14
【问题描述】:
我们在数据库中发现了一些违反活动约束的行。这怎么可能?
约束处于活动状态,因为我们不能手动添加绕过此约束的行。然而,当我们运行CHECKCONSTRAINTS(Files) 时,我们发现它在我们的测试运行中被绕过了几次。有问题的行都是在半秒内创建的,这表明存在某种竞争条件。
这是应用于表的约束。该规则旨在确保给定父文件夹中的名称唯一性:
ALTER TABLE Files ADD CONSTRAINT UniqueNameInParentFolder CHECK
CheckUniqueNameInFolder(ParentFoldersID, Name) = 1;
此约束调用如下所示的函数:
-- first check for the new name in the Folders table
IF ((SELECT COUNT(*) FROM Folders
WHERE ParentFoldersID = @FoldersID AND Name = @Name) = 0)
BEGIN
-- then check for it in the Files table
IF ((SELECT COUNT(*) FROM Files
WHERE ParentFoldersID = @FoldersID AND Name = @Name) <= 1)
RETURN 1
END
RETURN 0
单个行被添加到事务中,所以我很难理解重复行是如何绕过这个限制的。
【问题讨论】:
-
是的,我们对
Folders有类似的限制,在那里也看到了类似数量的违规行为。我们目前正在使用READ_COMMITTED_SNAPSHOT。
标签: sql-server sql-server-2008