Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wyłączyć ograniczenie klucza obcego w programie SQL Server (przykłady T-SQL)

Jeśli znajdziesz się w sytuacji, w której musisz wyłączyć ograniczenie klucza obcego w SQL Server, oto jak to zrobić za pomocą Transact-SQL.

Umożliwi to wprowadzanie danych bez ograniczeń związanych z kluczem obcym. Oczywiście nie zrobiłbyś tego, gdyby nie miał bardzo dobrego powodu, aby to zrobić. Klucze obce wymuszają integralność referencyjną, więc ich wyłączenie może powodować różnego rodzaju problemy.

Przykład 1 – Wyłącz ograniczenie klucza obcego

Aby wyłączyć ograniczenie klucza obcego, użyj NOCHECK argument w ALTER TABLE oświadczenie.

Tak:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Ten kod wyłącza ograniczenie klucza obcego o nazwie FK_BandMember_Musician .

Przykład 2 – Przejrzyj ograniczenie

Możemy zapytać o sys.foreign_keys widok systemu, aby sprawdzić, czy nasze ograniczenie zostało wyłączone:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Wynik:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

W tym przypadku wybrałem wszystkie ograniczenia klucza obcego z bieżącej bazy danych.

Widzimy, że jest to jedyny wyłączony (ponieważ jego is_disabled kolumna jest ustawiona na 1 ).

Możesz zauważyć, że jest_nie_zaufany kolumna jest również ustawiona na 1 . Oznacza to, że ograniczenie nie zostało zweryfikowane przez system.

Ma to sens, ponieważ nie możemy już zakładać, że ograniczenie sprawdziło wszystkie dane. Fakt, że ograniczenie jest wyłączone, oznacza, że ​​dane są teraz w stanie dostać się do bazy danych bez sprawdzania przez ograniczenie. Dlatego istnieje możliwość, że w bazie danych znajdą się nieprawidłowe dane.

Jeśli kiedykolwiek będziesz musiał ponownie włączyć ograniczenie, będziesz mieć możliwość przywrócenia zaufania ograniczenia (poprzez użycie WITH CHECK opcja). Spowoduje to sprawdzenie wszystkich istniejących wierszy przed włączeniem ograniczenia.

Będziesz mieć również możliwość nie sprawdzanie istniejących danych, ale należy to robić tylko w rzadkich przypadkach.

Oto ponownie to samo zapytanie, ale z kilkoma dodatkowymi kolumnami pokazującymi tabele i tabele, do których istnieją odwołania:

SELECT 
  name AS 'Constraint',
  OBJECT_NAME(parent_object_id) AS 'Table',
  OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Wynik:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego nazwy tabel w SQL Server zaczynają się od dbo?

  2. Różnica między wielowyrazowymi funkcjami z wartościami tabelarycznymi a wbudowanymi funkcjami z wartościami tabelarycznymi w programie SQL Server

  3. nvarchar konkatenacja / index / nvarchar(max) niewytłumaczalne zachowanie

  4. Żądanie nie powiodło się lub usługa nie odpowiedziała na czas?

  5. Jak wbudować funkcjonalność RUNAS /NETONLY do programu (C#/.NET/WinForms)?