Disabilitare i vincoli di chiave esterna con le istruzioni INSERT e UPDATE

Si applica a: SQL Server 2016 (13.x) e versioni successiveDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

È possibile disabilitare un vincolo di chiave esterna durante le transazioni INSERT e UPDATE in SQL Server usando SQL Server Management Studio o Transact-SQL. Usare questa opzione se si è sicuri che i nuovi dati non violeranno il vincolo esistente o se il vincolo si applica solo ai dati già presenti nel database.

Limitazioni e restrizioni

Dopo aver disabilitato questi vincoli, gli inserimenti o gli aggiornamenti successivi della colonna non saranno convalidati in base alle condizioni del vincolo.

Autorizzazioni

È necessario disporre dell'autorizzazione ALTER per la tabella.

Usare SQL Server Management Studio

Per disabilitare un vincolo di chiave esterna per le istruzioni INSERT e UPDATE

  1. In Esplora oggettiespandere la tabella contenente il vincolo, quindi espandere la cartella Chiavi .

  2. Fare clic con il pulsante destro del mouse sul vincolo e selezionare Modifica.

  3. Nella griglia in Progettazione tabelle, selezionare Attiva vincolo della chiave esterna, quindi selezionare No nel menu a discesa.

  4. Selezionare Chiudi.

  5. Per riabilitare il vincolo quando necessario, invertire i passaggi precedenti. Selezionare Attiva vincolo della chiave esterna, quindi selezionare nel menu a discesa.

  6. Per considerare attendibile il vincolo controllando i dati esistenti nella relazione della chiave esterna, selezionare Verifica dati esistenti durante la creazione o la riabilitazione, quindi selezionare dal menu a discesa. Ciò garantisce che il vincolo della chiave esterna sia attendibile.

  • Se Verifica dati esistenti durante la creazione o la riabilitazione è impostata su No, la chiave esterna non controlla i dati esistenti quando viene riabilitata. Query Optimizer non riesce quindi a prendere in considerazione potenziali miglioramenti delle prestazioni. Le chiavi esterne attendibili sono consigliate perché possono essere usate per semplificare i piani di esecuzione con presupposti basati sul vincolo della chiave esterna. Per verificare se le chiavi esterne sono attendibili nel database, vedere una query di esempio più avanti in questo articolo.

Usare Transact-SQL

Per disabilitare un vincolo di chiave esterna per le istruzioni INSERT e UPDATE

  1. In Esplora oggetti connettersi a un'istanza del motore di database.

  2. Sulla barra Standard selezionare Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  4. Per riabilitare il vincolo quando necessario, copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

    USE AdventureWorks2022;  
    GO  
    ALTER TABLE Purchasing.PurchaseOrderHeader  
    CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID;  
    GO  
    
  5. Verificare che il vincolo nell'ambiente sia attendibile e abilitato. Se is_not_trusted = 1, la chiave esterna non controlla i dati esistenti quando viene riabilitata o ricreata. Query Optimizer non riesce quindi a prendere in considerazione potenziali miglioramenti delle prestazioni. Le chiavi esterne attendibili sono consigliate perché possono essere usate per semplificare i piani di esecuzione con presupposti basati sul vincolo della chiave esterna. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

    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
    

    È consigliabile impostare il vincolo della chiave esterna su attendibile se i dati esistenti nella tabella sono conformi al vincolo della chiave esterna. Per impostare la chiave esterna su attendibile, usare lo script seguente per considerare di nuovo attendibile il vincolo della chiave esterna, notando la sintassi aggiuntiva WITH CHECK. Copiare e incollare l'esempio seguente nella finestra di query e selezionare Esegui.

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

Passaggi successivi