分享方式:


停用 INSERT 和 UPDATE 陳述式的外部索引鍵條件約束

適用於: SQL Server 2016 (13.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

您可以使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 中停用外部索引鍵條件約束。 如果您確知新資料不會違反現有條件約束,或是條件約束只適用於已經在資料庫中的資料,請使用此選項。

限制事項

停用這些條件約束之後,未來將不會根據條件約束的條件驗證資料行的插入或更新作業。

權限

需要資料表的 ALTER 權限。

使用 SQL Server Management Studio

若要停用 INSERT 和 UPDATE 陳述式的外部索引鍵條件約束

  1. [物件總管]中,展開含有條件約束的資料表,然後展開 [索引鍵] 資料夾。

  2. 以滑鼠右鍵按一下條件約束,然後選取 [修改]

  3. 在 [資料表設計工具] 底下的方格中,選取 [強制使用外部索引鍵條件約束],然後從下拉式功能表中選取 [否]。

  4. 選取 [關閉]。

  5. 若要視需要重新啟用條件約束,請反轉上述步驟。 選取 [強制使用外部索引鍵條件約束],然後從下拉式功能表中選取 [是]。

  6. 若要藉由檢查外部索引鍵關聯性中的現有資料來信任條件約束,請選取 [檢查建立或重新啟用時的現有資料],然後從下拉式功能表中選取 [是]。 這可確保外部索引鍵條件約束受到信任。

  • 如果 [檢查建立或重新啟用時的現有資料] 設定為 [否],外部索引鍵就不會在重新啟用時檢查現有的資料。 因此,查詢最佳化工具無法考慮潛在的效能改善。 建議使用受信任的外部索引鍵,因為這些外部索引鍵可用來簡化執行計畫,並假設以外部索引鍵條件約束為基礎。 若要檢查資料庫中是否信任外部索引鍵,請參閱本文稍後的範例查詢。

使用 Transact-SQL

若要停用 INSERT 和 UPDATE 陳述式的外部索引鍵條件約束

  1. 在物件總管中,連線到資料庫引擎的執行個體。

  2. 在標準列上,選取 [新增查詢] 。

  3. 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  4. 若要在需要時重新啟用條件約束,請將下列範例複製並貼到查詢視窗中,然後選取 [執行]。

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  5. 確認您環境中的條件約束都受信任且已啟用。 如果 is_not_trusted = 1,則外部索引鍵不會在重新啟用或重新建立資料時檢查現有的資料。 因此,查詢最佳化工具無法考慮潛在的效能改善。 建議使用受信任的外部索引鍵,因為這些外部索引鍵可用來簡化執行計畫,並假設以外部索引鍵條件約束為基礎。 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    SELECT o.name, fk.name, fk.is_not_trusted, fk.is_disabled
    FROM sys.foreign_keys AS fk
    INNER JOIN sys.objects AS o ON fk.parent_object_id = o.object_id
    WHERE fk.name = 'FK_PurchaseOrderHeader_Employee_EmployeeID';
    GO
    

    如果資料表中的現有資料符合外部索引鍵條件約束,您應該將外部索引鍵條件約束設定為受信任。 若要將外部索引鍵設定為受信任,請使用下列指令碼再次信任外部索引鍵條件約束,並記下其他 WITH CHECK 語法。 複製下列範例並將其貼到查詢視窗中,然後選取 [執行]。

    ALTER TABLE [Purchasing].[PurchaseOrderHeader] 
    WITH CHECK 
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;
    GO
    

下一步