检查约束在 SQL 服务器中不起作用

Check CONSTRAINT Not work in SQL Server

我必须限制在我的 table 中插入重复数据

这里是SQL服务器Table

CREATE TABLE [dbo].[temptbl](
    [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [DSGN] [varchar](500) NULL,
    [RecordType] [varchar](1000) NULL
)

我想在 RecordType 上设置条件,如果 RecordType 是 'SA' 则检查 CONSTRAINT(意味着如果 DSGN = 0 且 RecordType = 'SA' 存在,我不想插入该数据。

如果 DSGN = 1 且 RecordType = 'SA' 不存在,我想插入该数据。

如果 RecordType 不是 'SA' 则插入任何数据

为此我创建了约束,但它不起作用

ALTER TABLE temptbl  WITH CHECK  ADD CONSTRAINT chk_Stuff CHECK (([dbo].[chk_Ints]([DSGN],[RecordType])=(0)))
GO



ALTER FUNCTION [dbo].[chk_Ints](@Int_1 int,@Int_2 varchar(20))
RETURNS int
AS
BEGIN

DECLARE @Result INT

    BEGIN
        IF @Int_2 = 'SA'
        BEGIN
            IF NOT EXISTS (SELECT * FROM [temptbl] WHERE DSGN = @Int_1 AND RecordType = @Int_2)
            BEGIN
                SET @Result = 0
            END
            ELSE 
            BEGIN
                SET @Result = 1
            END
        END
        ELSE
        BEGIN
            SET @Result = 0
        END
    END 
    RETURN @Result
END

但它不起作用。请给我建议

放弃函数和检查约束:

CREATE UNIQUE INDEX IX_temptbl_SA ON temptbl (DSGN) WHERE RecordType='SA'

这被称为 filtered index

您的检查约束没有像您想象的那样工作,因为当为任何特定行评估检查约束时,该行已经在 table 中可见(在该事务的上下文中)并且所以每一行都有效地阻止了它的自己的插入。

仅对新数据使用With NOCheck。这里是link提供的

https://technet.microsoft.com/en-us/library/ms179491(v=sql.105).aspx