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

Jak povolit všechna omezení CHECK a cizích klíčů v databázi 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 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.


  1. Chyba Postgres SSL SYSCALL:EOF detekován pomocí pythonu a psycopg

  2. Porovnejte pole pro rovnost, ignorujte pořadí prvků

  3. Jsou mysql_real_escape_string() a mysql_escape_string() dostatečné pro zabezpečení aplikace?

  4. MySQL Master to Master replikace