Sql-Server

靜默啟用約束失敗

  • August 14, 2015

為什麼 SQL Server 會默默地重新啟用外鍵約束?

我最近嘗試使用ALTER TABLE. 大多數成功啟用;但是,少數約束仍被sys.foreign_keys.

例子:

ALTER TABLE [dbo].[Table] WITH CHECK NOCHECK CONSTRAINT FK_ConstraintName; 
-- Command(s) completed successfully.

SELECT is_disabled FROM sys.foreign_keys 
WHERE name = 'FK_Constraint' AND parent_object_id = OBJECT_ID('[dbo].[Table]');
-- returns "1", indicating that the constraint is still disabled

您面臨的問題是您實際上並沒有重新啟用您的約束(由 定義NOCHECK)。

重新啟用約束的語法如下:

ALTER TABLE <tablename>
WITH { CHECK | NOCHECK }
CHECK CONSTRAINT <constraintname>;

WITH CHECK|NOCHECK告訴 SQL Server 是否要根據約束檢查表中的現有數據。如果您NOCHECK在此處聲明,那麼您的約束將不受信任,由is_not_trusted = 1in定義sys.foreign_keys

通過陳述NOCHECK為第二部分,您實際上是在說disable the constraint

在您的情況下,如果您不想檢查現有數據,則需要NOCHECK CHECK.

ALTER TABLE [dbo].[Table] WITH NOCHECK CHECK CONSTRAINT FK_ConstraintName; 

進一步閱讀信任你的約束

引用自:https://dba.stackexchange.com/questions/111049