Níže uvedený kód můžete použít k povolení všech CHECK
a omezení cizího klíče pro aktuální databázi na serveru SQL.
Když povolíte CHECK
nebo omezení cizího klíče, máte možnost zkontrolovat existující data v tabulce před povolením omezení. To vám umožní ověřit, zda některá existující omezení porušuje nebo ne. K provedení této kontroly použijte WITH CHECK
v kódu, jinak použijte WITH NOCHECK
.
Ukázkový kód
Zde je návod, jak povolit všechny CHECK
a omezení cizího klíče v rámci databáze. První příklad kontroluje existující data, druhý ne.
Se šekem (doporučeno):
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Bez šeku:
EXEC sp_MSforeachtable "ALTER TABLE ? S NOCHECK CHECK CONSTRAINT ALL"
Můžete také explicitně zadat název argumentu (@command1
), pokud chcete (v obou případech získáte stejný výsledek).
Se šekem:
EXEC sp_MSforeachtable @command1="ZMĚNIT TABULKU ? S KONTROLOU KONTROLA OMEZENÍ VŠECHNY"
Bez šeku:
EXEC sp_MSforeachtable @command1="ZMĚNIT TABULKU ? S KONTROLOU KONTROLA OMEZENÍ VŠECHNY"
Tyto příklady používají (nedokumentovaný) sp_MSforeachtable
uložené procedury. Tento postup umožňuje provádět úlohy pro každou tabulku v databázi. Takže je to perfektní pro náš úkol – povolit všechny CHECK
a omezení cizího klíče v aktuální databázi.
Níže je uveden příklad, kde to udělám a poté zkontroluji výsledek.
Příklad 1 – Kontrola omezení
Nejprve se rychle podívám na aktuální CHECK
a omezení cizího klíče v databázi, abyste viděli, zda jsou povolena nebo zakázána.
SELECT OBJECT_NAME(parent_object_id) AS 'Tabulka', název AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_checked_constraints; sys.Výsledek:
+----------------+-----------------+------------ ----+-------------------+| Tabulka | Omezení | is_disabled | není_důvěryhodný ||----------------+-----------------+------------ ---+-------------------|| Test omezení | chkCena | 1 | 1 || Test omezení | chkValidEndDate | 1 | 1 || Test omezení | chkTeamSize | 1 | 1 || Povolání | chkJobTitle | 1 | 1 |+----------------+-----------------+------------- ---+------------------+Aktuálně tedy existují čtyři
CHECK
omezení omezení v databázi pro dvě různé tabulky.Vidíme, že všechna omezení jsou zakázána, protože is_disabled je nastaven na 1 .
Všechny jsou také nedůvěryhodné, protože is_not_trusted je také nastaven na 1 .
Příklad 2 – Povolte omezení pomocí WITH CHECK
Nyní povolím všechna omezení pomocí
WITH CHECK
argument:EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"Při provádění tohoto typu věcí je vždy dobré se ujistit, že používáte správnou databázi. Takže bychom mohli upravit kód tak, že se nejprve přepneme do správné databáze:
USE Test;EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"V tomto případě přepnu do databáze s názvem Test před provedením uložené procedury.
Příklad 3 – Kontrola výsledku
Po spuštění výše uvedeného kódu nyní spustím stejný dotaz z prvního příkladu, abych viděl výsledek.
SELECT OBJECT_NAME(parent_object_id) AS 'Tabulka', název AS 'Constraint', is_disabled, is_not_trustedFROM sys.foreign_keysUNIONSELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_checked_constraints; sys.Výsledek:
+----------------+-----------------+------------ ----+-------------------+| Tabulka | Omezení | is_disabled | není_důvěryhodný ||----------------+-----------------+------------ ---+-------------------|| Test omezení | chkCena | 0 | 0 || Test omezení | chkValidEndDate | 0 | 0 || Test omezení | chkTeamSize | 0 | 0 || Povolání | chkJobTitle | 0 | 0 |+----------------+-----------------+------------- ---+------------------+Takže všechna omezení v databázi byla nyní povolena (protože is_disabled sloupec je nastaven na 0 pro všechna omezení).
Můžeme také vidět, že is_not_trusted sloupec je také nastaven na 0 . To znamená, že omezení je důvěryhodné. Je důvěryhodná, protože jsme ji dostali ke kontrole všech existujících dat, než bude povolena.
Pokud bych použil
WITH NOCHECK
, omezení zůstanou nedůvěryhodná (tj. jejich is_not_trusted příznak by byl nastaven na 1 ). Je to proto, že databáze by mohla potenciálně obsahovat data, která porušují jedno (nebo více) omezení (do databáze se mohla dostat neplatná data, když byla omezení deaktivována).Ve vzácných případech může být nutné ponechat v databázi neplatná data. V takových případech bude muset omezení zůstat nedůvěryhodné, protože stávající data by neprošla počáteční kontrolou, a proto by omezení nebylo možné aktivovat, pokud nepoužívá
WITH NOCHECK
.Podrobný příklad přepínání mezi důvěryhodným a nedůvěryhodným při deaktivaci a opětovném povolení omezení naleznete v části Co byste měli vědět o WITH NOCHECK při povolování omezení CHECK v SQL Server.
Povolte omezení jednotlivě
Pokud chcete povolit omezení pouze jedno po druhém, přečtěte si část Jak povolit omezení CHECK na serveru SQL Server a Jak povolit cizí klíč na serveru SQL.