sql >> Databáze >  >> RDS >> Sqlserver

Jak povolit všechna omezení CHECK a cizích klíčů pro tabulku na serveru SQL (příklady T-SQL)

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 pro ConstraintTest 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é a WITH NOCHECK pro ostatní).

Viz Jak povolit omezení CHECK na serveru SQL a Jak povolit cizí klíč na serveru SQL.


  1. Vrátit dotaz z funkce?

  2. Oracle (starý?) Joins – nástroj/skript pro konverzi?

  3. Index oddílu Oracle

  4. Jak dotazovat vnořená pole ve sloupci postgres json?