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

Jak zakázat 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 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.


  1. Jak vyřešit problém Nelze načíst ověřovací plugin 'caching_sha2_password'

  2. SQLite - Pusťte databázi

  3. Zrychlí přidání 'LIMIT 1' do MySQL dotazů, když víte, že bude pouze 1 výsledek?

  4. Vytvořte dočasnou tabulku v příkazu SELECT bez samostatné CREATE TABLE