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