Níže uvedený kód můžete použít k povolení všech CHECK
a omezení cizího klíče pro konkrétní tabulku na serveru SQL.
Když povolíte omezení na serveru SQL Server, musíte se rozhodnout, zda má zkontrolovat existující data nebo ne. To je důležité, pokud tabulka již obsahuje data, protože tato existující data mohou potenciálně porušovat pravidla omezení.
Ukázky prohlášení
Níže jsou uvedeny dva vzorové příkazy, které ukazují rozdíl mezi kontrolou existujících dat a jejich nekontrolováním, když povolíte omezení.
Pro kontrolu existujících dat použijte WITH CHECK
ve vašem příkazu při povolování omezení, jinak použijte WITH NOCHECK
.
Se šekem:
ALTER TABLE TableName WITH CHECK CHECK CONSTRAINT ALL
Bez kontroly:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Stačí nahradit TableName
s názvem příslušné tabulky.
Níže je uveden příklad, kde to dělám a zkontroluji výsledky.
Příklad 1 – Kontrola omezení
Nejprve se rychle podívám na aktuální CHECK
omezení 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 | 0 | 0 |+----------------+-----------------+------------- ---+------------------+Aktuálně tedy existují čtyři
CHECK
omezení v databázi, z nichž tři jsou proConstraintTest
tabulka.Vidíme, že všechna omezení pro tabulku jsou deaktivována, protože is_disabled je nastaven na 1 .
Můžeme také vidět, že is_not_trusted sloupec je nastaven na 1 pro tato omezení. To znamená, že se jim nevěří. Když jsou zakázány, nelze jim důvěřovat, protože neplatná data mohou vstoupit do databáze bez kontroly. Více o tom níže.
Druhé omezení (pro jinou tabulku) je již povoleno a důvěryhodné (v tomto článku však můžeme tuto tabulku/omezení ignorovat).
Příklad 2 – Povolte omezení pomocí WITH CHECK
Nyní povolím všechna omezení pro
ConstraintTest
tabulka:ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;To je vše – hotovo.
Nyní spustíme stejný dotaz z prvního příkladu, abychom viděli 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 |+----------------+-----------------+------------- ---+------------------+Všechna tři omezení pro ConstraintTest tabulky jsou nyní povoleny a důvěryhodné.
Jsou důvěryhodné, protože jsem použil
WITH CHECK
v mém prohlášení. Kdybych to neudělal, dostal bych jiný výsledek, jak uvidíte níže.Pomocí
WITH CHECK
, mohu si být jistý, že všechna existující data v tabulce skutečně vyhovují omezením.Příklad 3 – Povolte omezení pomocí WITH NOCHECK
Nyní znovu povolím omezení pomocí
WITH CHECK
takže můžeme vidět, jak to ovlivní výsledek.Nejprve je ale budu muset deaktivovat:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;Zkontrolujte, zda jsou deaktivovány:
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 | 0 | 0 |+----------------+-----------------+------------- ---+------------------+Takže jsou znovu deaktivovány.
Nyní je znovu povolte pomocí
WITH NOCHECK
:ALTER TABLE ConstraintTest S NOCHECK CHECK CONSTRAINT ALL;Zkontrolujte znovu:
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 | 1 || Test omezení | chkValidEndDate | 0 | 1 || Test omezení | chkTeamSize | 0 | 1 || Povolání | chkJobTitle | 0 | 0 |+----------------+-----------------+------------- ---+------------------+Vidíme, že omezení byla úspěšně povolena, ale tentokrát zůstávají nedůvěryhodná.
Omezení jsou nedůvěryhodná, protože před aktivací nezkontrolovala žádná existující data.
Klíčovým bodem zde tedy je, že pokud chcete, aby byla vaše omezení důvěryhodná, nezapomeňte použít
WITH CHECK
při jejich povolení.Povolení omezení jednotlivě
Pokud nechcete povolit všechna omezení najednou, můžete je povolit jednotlivě. To může být také užitečné, pokud potřebujete povolit všechna omezení, ale potřebujete použít jiná nastavení (např.
WITH CHECK
pro některé aWITH NOCHECK
pro ostatní).Viz Jak povolit omezení CHECK na serveru SQL a Jak povolit cizí klíč na serveru SQL.