Wyłączanie ograniczeń klucza obcego za pomocą instrukcji INSERT i UPDATE
Dotyczy: SQL Server 2016 (13.x) i nowszych
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Database w usłudze Microsoft Fabric
Ograniczenie klucza obcego można wyłączyć podczas transakcji INSERT i UPDATE w programie SQL Server przy użyciu programu SQL Server Management Studio lub Transact-SQL. Użyj tej opcji, jeśli wiesz, że nowe dane nie będą naruszać istniejącego ograniczenia lub jeśli ograniczenie dotyczy tylko danych już w bazie danych.
Ograniczenia i ograniczenia
Po wyłączeniu tych ograniczeń przyszłe wstawki lub aktualizacje kolumny nie zostaną zweryfikowane pod kątem warunków ograniczeń.
uprawnienia
Wymaga uprawnienia ALTER w tabeli.
Korzystanie z programu SQL Server Management Studio
Aby wyłączyć ograniczenie klucza obcego przy wykonywaniu operacji INSERT i UPDATE
W Eksploratorze obiektówrozwiń tabelę z ograniczeniem, a następnie rozwiń folder Klucze.
Kliknij prawym przyciskiem myszy ograniczenie i wybierz pozycję Modyfikuj.
W siatce w obszarze Table Designerwybierz pozycję Wymuszaj ograniczenie klucza obcego i wybierz pozycję Nie z menu rozwijanego.
Wybierz Zamknij.
Aby ponownie włączyć ograniczenie w razie potrzeby, odwrócić powyższe kroki. Wybierz pozycję Wymuszaj ograniczenie klucza obcego i wybierz pozycję Tak z menu rozwijanego.
Aby zaufać ograniczeniu, sprawdzając istniejące dane w relacji klucza obcego, wybierz opcję Sprawdź istniejące dane podczas tworzenia lub ponownego włączania i wybierz Tak z menu rozwijanego. To zapewni, że ograniczenie klucza obcego będzie zaufane.
- Jeśli opcja "Sprawdzanie Istniejących Danych podczas Tworzenia lub Ponownego Włączania" jest ustawiona na "Nie", to klucz obcy nie sprawdza istniejących danych przy ponownym włączeniu. Optymalizator zapytań nie może zatem rozważyć potencjalnych ulepszeń wydajności. Zalecane są uznane klucze obce, ponieważ mogą służyć do uproszczenia planów wykonania, przyjmując założenia wynikające z ograniczenia klucza obcego. Aby sprawdzić, czy klucze obce są zaufane w bazie danych, zobacz przykładowe zapytanie w dalszej części tego artykułu.
Korzystanie z Transact-SQL
Aby wyłączyć ograniczenie klucza obcego dla instrukcji INSERT i UPDATE
W Eksploratorze obiektów , nawiąż połączenie z wystąpieniem silnika bazy danych.
Na pasku narzędzi Standard wybierz opcję Nowe zapytanie.
Skopiuj poniższy przykład i wklej go w oknie zapytania, a następnie wybierz pozycję Wykonaj.
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader NOCHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
Aby ponownie włączyć ograniczenie w razie potrzeby, skopiuj i wklej poniższy przykład w oknie zapytania, a następnie wybierz pozycję Wykonaj.
USE AdventureWorks2022; GO ALTER TABLE Purchasing.PurchaseOrderHeader CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO
Sprawdź, czy ograniczenie w danym środowisku jest zarówno zaufane, jak i włączone. Jeśli
is_not_trusted
= 1, klucz obcy nie sprawdza istniejących danych po ponownym włączeniu lub ponownym utworzeniu. Optymalizator zapytań nie może zatem rozważyć potencjalnych ulepszeń wydajności. Zalecane są zaufane klucze obce, ponieważ mogą służyć do uproszczenia planów wykonywania z założeniami opartymi na ograniczeniu klucza obcego. Skopiuj poniższy przykład i wklej go w oknie zapytania, a następnie wybierz pozycję Wykonaj.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
Należy ustawić ograniczenie klucza obcego na zaufane, jeśli istniejące dane w tabeli są zgodne z ograniczeniem klucza obcego. Aby ustawić klucz obcy na zaufany, użyj następującego skryptu, aby ponownie ufać ograniczeniu klucza obcego, zwracając uwagi na dodatkową składnię
WITH CHECK
. Skopiuj poniższy przykład i wklej go w oknie zapytania, a następnie wybierz pozycję Wykonaj.ALTER TABLE [Purchasing].[PurchaseOrderHeader] WITH CHECK CHECK CONSTRAINT FK_PurchaseOrderHeader_Employee_EmployeeID; GO