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