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

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

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

Когато активирате CHECK или ограничение на външен ключ, имате възможност да проверите съществуващите данни в таблицата, преди ограничението да бъде активирано. Това ви позволява да проверите дали някое съществуващо нарушава ограничението или не. За да извършите тази проверка, използвайте WITH CHECK в кода, в противен случай използвайте WITH NOCHECK .

Примерен код

Ето как да активирате всички CHECK и ограничения на външния ключ в базата данни. Първият пример проверява съществуващите данни, вторият не.

С проверка (препоръчително):

EXEC sp_MSforeachtable "ПРОМЕНЯ ТАБЛИЦА ? С ПРОВЕРКА ПРОВЕРКА НА ОГРАНИЧЕНИЕ ВСИЧКИ"

Без проверка:

EXEC sp_MSforeachtable "ПРОМЕНЯ ТАБЛИЦА ? С NOCHECK ПРОВЕРКА ОГРАНИЧЕНИЕ ВСИЧКИ"

Можете също така изрично да предоставите името на аргумента (@command1 ), ако предпочитате (ще получите същия резултат и в двата случая).

С чек:

EXEC sp_MSforeachtable @command1="ПРОМЕНЯ ТАБЛИЦА ? С ПРОВЕРКА ПРОВЕРКА НА ОГРАНИЧЕНИЕТО ВСИЧКИ"

Без проверка:

EXEC sp_MSforeachtable @command1="ПРОМЕНЯ ТАБЛИЦА ? С ПРОВЕРКА ПРОВЕРКА НА ОГРАНИЧЕНИЕТО ВСИЧКИ"

Тези примери използват (недокументирани) sp_MSforeachtable съхранена процедура. Тази процедура ви позволява да изпълнявате задачи срещу всяка таблица в база данни. Така че е идеално за нашата задача тук – да активираме всички CHECK и ограничения на външния ключ в текущата база данни.

По-долу е даден пример, където правя това и след това проверявам резултата.

Пример 1 – Преглед на ограниченията

Първо, ще разгледам набързо текущата CHECK и ограничения на външния ключ в базата данни, за да видите дали са активирани или деактивирани.

SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM> s_not_trustedFROM> 

Резултат:

+----------------+----------------+----------- ----+-----------------+| Таблица | Ограничение | е_забранено | е_не_доверен ||----------------+----------------+------------ ---+------------------|| ConstraintTest | chkPrice | 1 | 1 || ConstraintTest | chkValidEndDate | 1 | 1 || ConstraintTest | chkTeamSize | 1 | 1 || Професия | chkJobTitle | 1 | 1 |+----------------+----------------+----------- ---+------------------+

Така че в момента има четири CHECK ограничения ограничения в базата данни, за две различни таблици.

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

Освен това всички те не са доверени, защото is_not_trusted също е настроен на 1 .

Пример 2 – Активирайте ограниченията с помощта на WITH CHECK

Сега ще активирам всички ограничения с помощта на WITH CHECK аргумент:

EXEC sp_MSforeachtable "ПРОМЕНЯ ТАБЛИЦА ? С ПРОВЕРКА ПРОВЕРКА НА ОГРАНИЧЕНИЕ ВСИЧКИ"

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

ИЗПОЛЗВАЙТЕ тест;EXEC sp_MSforeachtable "ПРОМЕНЯ ТАБЛИЦА ? С ПРОВЕРКА ПРОВЕРКА НА ОГРАНИЧЕНИЕТО ВСИЧКИ"

В този случай преминавам към база данни, наречена Test преди да изпълните съхранената процедура.

Пример 3 – Проверете резултата

След като изпълних горния код, сега ще изпълня същата заявка от първия пример, за да видя резултата.

SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trustedFROM> s_not_trustedFROM> 

Резултат:

+----------------+----------------+----------- ----+-----------------+| Таблица | Ограничение | е_забранено | е_не_доверен ||----------------+----------------+------------ ---+------------------|| ConstraintTest | chkPrice | 0 | 0 || ConstraintTest | chkValidEndDate | 0 | 0 || ConstraintTest | chkTeamSize | 0 | 0 || Професия | chkJobTitle | 0 | 0 |+----------------+----------------+----------- ---+------------------+

Така че всички ограничения в базата данни вече са активирани (защото is_disabled колоната е настроена на 0 за всички ограничения).

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

Ако бях използвал WITH NOCHECK , ограниченията ще останат ненадеждни (т.е. техните is_not_trusted флагът ще бъде зададен на 1 ). Това е така, защото базата данни може потенциално да съдържа данни, които нарушават едно (или повече) от ограниченията (може да са влезли невалидни данни в базата данни, докато ограниченията са били деактивирани).

В редки случаи може да се наложи да съхранявате невалидни данни в базата данни. В такива случаи ограничението ще трябва да остане ненадеждно, тъй като съществуващите данни няма да преминат първоначалната проверка и следователно ограничението няма да може да бъде активирано, освен ако не използва WITH NOCHECK .

Вижте какво трябва да знаете за WITH NOCHECK, когато активирате ограничение CHECK в SQL Server за подробен пример за превключване между доверени и ненадеждни при деактивиране и повторно активиране на ограничение.

Разрешаване на ограниченията поотделно

Ако искате да активирате ограниченията само едно по едно, вижте Как да активирате ограничение CHECK в SQL Server и Как да активирате външен ключ в SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нуждаете се от колона за дата и час в SQL Server, която автоматично се актуализира, когато записът бъде променен

  2. Как да проверите настройките за конфигурация за поща на база данни в SQL Server (T-SQL)

  3. SQL - Изваждане на изчерпваща стойност от редове

  4. Как да променяте колони или да генерирате алтер скриптове с помощта на GUI в SQL Server - SQL Server / T-SQL Урок, част 38

  5. Случаен запис от таблица на база данни (T-SQL)