Inaktivera begränsningar för främmande nycklar med satserna INSERT och UPDATE

Gäller för: SQL Server 2016 (13.x) och senare versioner Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-databas i Microsoft Fabric

Du kan inaktivera en begränsning för sekundärnyckeln under INSERT och UPDATE transaktioner i SQL Server med hjälp av SQL Server Management Studio eller Transact-SQL. Använd det här alternativet om du vet att nya data inte bryter mot den befintliga begränsningen eller om villkoret endast gäller för data som redan finns i databasen.

Begränsningar och restriktioner

När du har inaktiverat dessa begränsningar verifieras inte framtida infogningar eller uppdateringar av kolumnen mot villkorsvillkoren.

behörigheter

Kräver ALTER-behörighet på tabellen.

Använda SQL Server Management Studio

Så här inaktiverar du en begränsning för främmande nyckel för INSERT- och UPDATE-satser

  1. I Object Explorerexpanderar du tabellen med villkoret och expanderar sedan mappen Nycklar.

  2. Högerklicka på villkoret och välj Ändra.

  3. I rutnätet under Table Designer, välj Enforce Foreign Key Constraint och välj Nej från rullgardinslistan.

  4. Välj Stäng.

  5. För att återaktivera begränsningen vid behov, vänd stegen ovan. Välj Verkställ främmande nyckelbegränsning och välj Ja från rullgardinsmenyn.

  6. För att lita på begränsningen genom att kontrollera befintlig data i främmande nyckelns relation, välj Kontrollera befintlig data vid skapande eller återaktivering och välj Ja från rullgardinslistan. Detta skulle säkerställa att begränsningen för den externa nyckeln är godkänd.

  • Om Kontrollera befintliga data vid skapande eller återaktivering av är inställd på Nej, kontrollerar inte främmande nyckeln befintliga data när den återaktiveras. Frågeoptimeraren kan därför inte överväga potentiella prestandaförbättringar. Betrodda utländska nycklar rekommenderas eftersom de kan användas för att förenkla exekveringsplaner med antaganden baserat på den utländska nyckelns begränsning. Om du vill kontrollera om främmande nycklar är betrodda i din databas, se en exempelfråga senare i den här artikeln.

Använd Transact-SQL

Så här inaktiverar du en begränsning för främmande nyckel för INSERT- och UPDATE-satser

  1. I Object Exploreransluter du till en instans av databasmotorn.

  2. I standardfältet väljer du Ny fråga.

  3. Kopiera och klistra in följande exempel i frågefönstret och välj Kör.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  4. Om du vill aktivera begränsningen igen kopierar du och klistrar in följande exempel i frågefönstret och väljer Kör.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  5. Kontrollera att begränsningen i din miljö är både betrodd och aktiverad. Om is_not_trusted = 1, kontrollerar inte den främmande nyckeln befintliga data när den återaktiveras eller återskapas. Frågeoptimeraren kan därför inte överväga potentiella prestandaförbättringar. Betrodda utländska nycklar rekommenderas eftersom de kan användas för att förenkla exekveringsplaner med antaganden baserat på den utländska nyckelns begränsning. Kopiera och klistra in följande exempel i frågefönstret och välj Kör.

    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
    

    Du bör ställa in referensbegränsningen som tillförlitlig om nuvarande data i tabellen uppfyller referensbegränsningen. För att ange den främmande nyckeln som betrodd, använd följande skript för att återigen etablera tillit till den främmande nyckelns villkor, och observera den extra syntaxen WITH CHECK. Kopiera och klistra in följande exempel i frågefönstret och välj Kör.

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