Tsql 我会告诉你的)。我相信查询优化器在这种情况下足够聪明,不会做出可能导致产生错误查询结果的错误判断。当约束失效时,不会出现任何系统不稳定。约束是为了强制执行我们预定义的规则。我现在在文档中找不到它,但最有可能的是,只有在插入或更新行时(仅针对插入或更新的行)

Tsql 我会告诉你的)。我相信查询优化器在这种情况下足够聪明,不会做出可能导致产生错误查询结果的错误判断。当约束失效时,不会出现任何系统不稳定。约束是为了强制执行我们预定义的规则。我现在在文档中找不到它,但最有可能的是,只有在插入或更新行时(仅针对插入或更新的行),tsql,sql-server-2012,Tsql,Sql Server 2012,我会告诉你的)。我相信查询优化器在这种情况下足够聪明,不会做出可能导致产生错误查询结果的错误判断。当约束失效时,不会出现任何系统不稳定。约束是为了强制执行我们预定义的规则。我现在在文档中找不到它,但最有可能的是,只有在插入或更新行时(仅针对插入或更新的行),才会评估/验证约束。因此,您可以在今天插入2016年的行,在下一年插入2017年的行,但如果在2017年尝试更新2016年创建的行,则更新将失败。如果你不去碰那一排,它就会像现在一样留在桌子上。@VladimirBaranov太好了,谢谢你的


我会告诉你的)。我相信查询优化器在这种情况下足够聪明,不会做出可能导致产生错误查询结果的错误判断。

当约束失效时,不会出现任何系统不稳定。约束是为了强制执行我们预定义的规则。我现在在文档中找不到它,但最有可能的是,只有在插入或更新行时(仅针对插入或更新的行),才会评估/验证约束。因此,您可以在今天插入2016年的行,在下一年插入2017年的行,但如果在2017年尝试更新2016年创建的行,则更新将失败。如果你不去碰那一排,它就会像现在一样留在桌子上。@VladimirBaranov太好了,谢谢你的增援,我也是这么看的。如果这是我的答案,我可以标记它。我真的很喜欢关于查询优化程序的信息。但是,关于启用检查,只有在尝试添加检查而不是启用检查时才会出现错误。如果已经添加了约束,您可以根据我在问题中更新的测试安全地启用它。@Storm,使用
alter table[T]nocheck constraint[CK]
禁用约束并使用
alter table[T]check constraint[CK]
重新启用约束将使约束处于
不受信任=1
状态(这可以在
sys.check\u constraints
中检查),但约束将被启用,并且以后的插入/更新将遵守约束规则。启用并不意味着受信任。使其再次受信任的唯一方法是使用check-check constraint[CK]执行
alter table[T]
。但是,最终这一限制将不可能实现。您的评论现在有意义了,您的原始答案中不太清楚,可能只是更新您的答案,用您在评论中发布的信息详细说明一下,因为信任问题是一个游戏规则改变者。我非常喜欢关于禁用和启用chec的输入k、 我确信它会失败,但后来我意识到,那只是在尝试创建支票时。
ALTER TABLE [X] WITH CHECK ADD CONSTRAINT [CCCHK03_TBX] CHECK
(
    [TBX_YEAR] = DATEPART( year, GetDate() )
)
IF ( OBJECT_ID( 'tempdb..#CheckTest' ) IS NOT NULL )
    DROP TABLE #CheckTest
GO

CREATE TABLE #CheckTest ( MN INT )
ALTER TABLE #CheckTest WITH CHECK ADD CONSTRAINT CHK_MN CHECK ( MN = DATEPART( SECOND, GETDATE() ) )
ALTER TABLE #CheckTest CHECK CONSTRAINT CHK_MN
GO

-- Control Test. This will fail with:
--Msg 547, Level 16, State 0, Line 12
--The INSERT statement conflicted with the CHECK constraint "CHK_MN". The conflict occurred in database "tempdb", table "dbo.#CheckTest", column 'MN'.
--The statement has been terminated.
INSERT INTO #CheckTest ( MN )
VALUES ( DATEPART( SECOND, DATEADD( SECOND, 5, GETDATE() ) ) )

-- Add 5 different seconds.
DECLARE @Counter int = 0;

WHILE @Counter < 5
BEGIN
    INSERT INTO #CheckTest ( MN )
    VALUES ( DATEPART( SECOND, GETDATE() ) )

    SET @Counter += 1;

    -- Delay for a second.
    WAITFOR DELAY '00:00:01';
END
GO

-- Add a different second.
-- Disabling and Enabling a check will work just fine so long as the check already exists.
ALTER TABLE #CheckTest NOCHECK CONSTRAINT CHK_MN;
INSERT INTO #CheckTest ( MN )
VALUES ( DATEPART( SECOND, DATEADD( SECOND, 5, GETDATE() ) ) )
ALTER TABLE #CheckTest CHECK CONSTRAINT CHK_MN;

-- Control Test. This will fail with:
--Msg 547, Level 16, State 0, Line 12
--The INSERT statement conflicted with the CHECK constraint "CHK_MN". The conflict occurred in database "tempdb", table "dbo.#CheckTest", column 'MN'.
--The statement has been terminated.
INSERT INTO #CheckTest ( MN )
VALUES ( DATEPART( SECOND, DATEADD( SECOND, 5, GETDATE() ) ) )
GO

-- Check table contents.
SELECT * FROM #CheckTest;
GO

-- Dropping and recreating the check constraint will result in an error:
--Msg 547, Level 16, State 0, Line 37
--The ALTER TABLE statement conflicted with the CHECK constraint "CHK_MN". The conflict occurred in database "tempdb", table "dbo.#CheckTest", column 'MN'.
ALTER TABLE #CheckTest DROP CONSTRAINT CHK_MN;
ALTER TABLE #CheckTest WITH CHECK ADD CONSTRAINT CHK_MN CHECK ( MN = DATEPART( SECOND, GETDATE() ) )
GO

DROP TABLE #CheckTest
GO
-- Disable check.
ALTER TABLE [Schema].[Table] NOCHECK CONSTRAINT [Check];

-- Makes changes here.

-- Enable check.
ALTER TABLE [Schema].[Table] CHECK CONSTRAINT [Check];
CREATE TABLE #CheckTest 
    (
        MN  INT CONSTRAINT CHK_MN  CHECK (MN = DATEPART(MINUTE, GETDATE()))
    )
;

-- Add two different minutes.
WHILE @COUNTER < 2 
BEGIN

    INSERT INTO #CheckTest
        (
            MN
        )
    VALUES
        (DATEPART(MINUTE, GETDATE()))
    ;

    SET @COUNTER = @COUNTER + 1;

    -- Delay for a minute.
    WAITFOR DELAY '00:01:00'
END

-- Check table contents.
SELECT
    *
FROM
    #CheckTest
;
ALTER TABLE [X] WITH CHECK ADD CONSTRAINT [CCCHK03_TBX] CHECK ...
ALTER TABLE [X] WITH CHECK CHECK CONSTRAINT [CCCHK03_TBX]
select is_not_trusted
from sys.check_constraints
where object_id = object_id('CCCHK03_TBX')