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

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

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

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

Примерни изявления

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

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

С чек:

ПРОМЕНИ ТАБЛИЦА Име на таблица С ПРОВЕРКА ПРОВЕРКА ОГРАНИЧЕНИЕ ВСИЧКИ

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

ПРОМЕНИ ТАБЛИЦА Име на таблица С NOCHECK ПРОВЕРКА ОГРАНИЧЕНИЕ ВСИЧКИ

Просто заменете TableName с името на приложимата таблица.

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

Пример 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 | 0 | 0 |+----------------+----------------+----------- ---+------------------+

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

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

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

Другото ограничение (за друга таблица) вече е активирано и има доверие (но можем да пренебрегнем тази таблица/ограничение в тази статия).

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

Сега ще активирам всички ограничения за ConstraintTest таблица:

ИЗМЕНИ ТАБЛИЦА Ограничен тест С ПРОВЕРКА ПРОВЕРКА ОГРАНИЧЕНИЕ ВСИЧКИ;

Това е – готово.

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

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 |+----------------+----------------+----------- ---+------------------+

И трите ограничения за ConstraintTest таблицата вече са активирани и надеждни.

Имат доверие, защото използвах WITH CHECK в моето изявление. Ако не бях, щях да получа различен резултат, както ще видите по-долу.

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

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

Сега ще активирам отново ограниченията с помощта на WITH CHECK така че можем да видим как това се отразява на резултата.

Но първо ще трябва да ги деактивирам:

ПРОМЕНЯ ТАБЛИЦА ОграничениеТест NOCHECK ОГРАНИЧЕНИЕ ВСИЧКИ;

Проверете дали са деактивирани:

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 | 0 | 0 |+----------------+----------------+----------- ---+------------------+

Така че те са деактивирани още веднъж.

Сега ги активирайте отново с помощта на WITH NOCHECK :

ИЗМЕНЯТЕ ТАБЛИЦА Ограничен тест С NOCHECK ПРОВЕРКА ОГРАНИЧЕНИЕ ВСИЧКИ;

Проверете отново:

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 | 1 || ConstraintTest | chkValidEndDate | 0 | 1 || ConstraintTest | chkTeamSize | 0 | 1 || Професия | chkJobTitle | 0 | 0 |+----------------+----------------+----------- ---+------------------+

Виждаме, че ограниченията са активирани успешно, но този път остават ненадеждни.

Ограниченията не са надеждни, тъй като не са проверили никакви съществуващи данни, преди да бъдат активирани.

Така че основният извод тук е, ако искате вашите ограничения да се доверяват, не забравяйте да използвате WITH CHECK когато ги активирате.

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

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

Вижте как да активирате ограничение 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. ExecuteNonQuery връща -1 при използване на sql COUNT въпреки низа на заявката

  3. Използвайте променлива с TOP в оператора select в SQL Server, без да го правите динамичен

  4. Възможно ли е да се използва пълнотекстово търсене (FTS) с LINQ?

  5. Изберете и редактирайте вертикални блокове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 9