Níže uvedený kód můžete použít k deaktivaci všech CHECK
a omezení cizího klíče pro aktuální databázi na serveru SQL.
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
Toto používá nezdokumentovaný sp_MSforeachtable
společnosti Microsoft 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 – deaktivovat všechny CHECK
omezení v rámci aktuální databáze.
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 | 0 | 0 || Test omezení | chkValidEndDate | 0 | 0 || Test omezení | chkTeamSize | 0 | 0 || Povolání | chkJobTitle | 0 | 0 |+----------------+-----------------+------------- ---+------------------+Aktuálně tedy existují čtyři
CHECK
omezení v databázi pro dvě různé tabulky.Vidíme, že všechna omezení jsou povolena, protože is_disabled je nastaveno na 0 .
Příklad 2 – Deaktivace omezení
Nyní deaktivuji všechna omezení:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"Obvykle je dobré se ujistit, že používáte správnou databázi, když děláte takové věci. Takže bychom mohli přidat k výše uvedenému kódu explicitním přepnutím na správnou databázi:
USE Test;EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"V tomto případě přepnu do databáze s názvem Test .
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 | 1 | 1 || Test omezení | chkValidEndDate | 1 | 1 || Test omezení | chkTeamSize | 1 | 1 || Povolání | chkJobTitle | 1 | 1 |+----------------+-----------------+------------- ---+------------------+Takže všechna omezení v databázi byla deaktivována (protože is_disabled sloupec je nastaven na 1 pro tato omezení).
Všimněte si, že is_not_trusted sloupec je také nastaven na 1 . Toto je důležité zvážit, zvláště pokud máte v úmyslu znovu aktivovat některé ze svých zakázaných omezení.
Informace o tom, jak obnovit důvěryhodnost při opětovném povolení vašich omezení, najdete v části Co byste měli vědět o WITH NOCHECK při povolování omezení CHECK v SQL Server. Informace v tomto článku platí také pro cizí klíče.
Deaktivujte omezení jednotlivě
Pokud chcete pouze deaktivovat omezení jednotlivě, přečtěte si příklady Jak deaktivovat omezení CHECK v SQL Server.