Можете да използвате кода по-долу, за да активирате всички 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.