Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да деактивирате ограничение на външния ключ в SQL Server (примери за T-SQL)

Ако се окажете в ситуация, в която трябва да деактивирате ограничение за външен ключ в SQL Server, ето как да направите това с помощта на Transact-SQL.

Това ще ви позволи да въвеждате данни, без да бъдете ограничени от външния ключ. Очевидно не бихте направили това, освен ако нямате много добра причина да го направите. Външните ключове налагат референтната цялост, така че деактивирането им има потенциал да създаде всякакви проблеми.

Пример 1 – Деактивирайте ограничението за външния ключ

За да деактивирате ограничение на външния ключ, използвайте NOCHECK аргумент в ALTER TABLE изявление.

Като това:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Този код деактивира ограничение на външния ключ, наречено FK_BandMember_Musician .

Пример 2 – Прегледайте ограничението

Можем да потърсим sys.foreign_keys системен изглед, за да проверите дали нашето ограничение е деактивирано:

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

Резултат:

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

В този случай избрах всички ограничения на външния ключ от текущата база данни.

Можем да видим, че това е единственият, който е деактивиран (защото is_disabled колоната е настроена на 1 ).

Може да забележите, че is_not_trusted колоната също е настроена на 1 . Това показва, че ограничението не е проверено от системата.

Това има смисъл, защото вече не можем да приемем, че ограничението е проверило всички данни. Фактът, че ограничението е деактивирано, означава, че данните вече могат да влязат в базата данни, без да бъдат проверявани от ограничението. Следователно съществува потенциал за невалидни данни да присъстват в базата данни.

Ако някога се наложи да активирате отново ограничението, ще имате възможност да възстановите доверието на ограничението (като използвате WITH CHECK опция). Това ще провери всички съществуващи редове, преди да активирате ограничението.

Ще имате и опцията не проверка на съществуващите данни, но това трябва да се прави само в редки случаи.

Ето отново същата заявка, но с някои допълнителни колони за показване на таблиците и референтните таблици:

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;

Резултат:

+--------------------------------+------------------+---------------------+---------------+------------------+
| 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. Минали ли са първичните ключове?

  2. Поправка:„BACKUP LOG не може да се извърши, защото няма текущо архивиране на базата данни.“ в SQL Server/SQL Edge

  3. Добавете колони към съществуваща таблица в базата данни на SQL Server

  4. Използване на колона за сортиране в таблица на база данни

  5. SQL Server 2017:Импортиране на CSV данни от Linux към Salesforce с SSIS