小编lad*_*dge的帖子

如何绕过我的 SQL Server 约束?

我们在我们的数据库中发现了一些违反活动约束的行。这怎么可能?

约束处于活动状态,因为我们不能手动添加绕过此约束的行。但是,当我们运行 时CHECKCONSTRAINTS(Files),我们发现它在我们的测试运行期间有几次被绕过了。有问题的行都是在半秒内创建的,表明存在某种竞争条件。

这是应用于表的约束。该规则旨在确保给定父文件夹中的名称唯一性:

ALTER TABLE Files ADD CONSTRAINT UniqueNameInParentFolder CHECK
    CheckUniqueNameInFolder(ParentFoldersID, Name) = 1;
Run Code Online (Sandbox Code Playgroud)

此约束调用如下所示的函数:

-- 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
Run Code Online (Sandbox Code Playgroud)

在事务中添加了单独的行,所以我很难理解重复的行是如何绕过这个限制的。

sql-server-2008 sql-server

8
推荐指数
3
解决办法
2583
查看次数

标签 统计

sql-server ×1

sql-server-2008 ×1