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

Jak zakázat omezení cizího klíče v SQL Server (příklady T-SQL)

Pokud se ocitnete v situaci, kdy potřebujete deaktivovat omezení cizího klíče v SQL Server, zde je návod, jak to udělat pomocí Transact-SQL.

To vám umožní zadávat data, aniž byste byli omezováni cizím klíčem. Je zřejmé, že byste to neudělali, pokud byste k tomu neměli dobrý důvod. Cizí klíče vynucují referenční integritu, takže jejich deaktivace může způsobit nejrůznější problémy.

Příklad 1 – Deaktivace omezení cizího klíče

Chcete-li zakázat omezení cizího klíče, použijte NOCHECK argument v ALTER TABLE prohlášení.

Takhle:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Tento kód deaktivuje omezení cizího klíče nazvané FK_BandMember_Musician .

Příklad 2 – Kontrola omezení

Můžeme se dotazovat na sys.foreign_keys systémové zobrazení pro ověření, že naše omezení bylo deaktivováno:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Výsledek:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

V tomto případě jsem vybral všechna omezení cizího klíče z aktuální databáze.

Vidíme, že toto je jediné, které je zakázáno (protože jeho is_disabled sloupec je nastaven na 1 ).

Můžete si všimnout, že is_not_trusted sloupec je také nastaven na 1 . To znamená, že omezení nebylo ověřeno systémem.

To dává smysl, protože již nemůžeme předpokládat, že omezení zkontrolovalo všechna data. Skutečnost, že omezení je zakázáno, znamená, že data se nyní mohou dostat do databáze, aniž by je omezení kontrolovalo. Proto existuje možnost, že v databázi budou přítomna neplatná data.

Pokud budete někdy potřebovat omezení znovu povolit, budete mít příležitost obnovit důvěryhodnost omezení (pomocí WITH CHECK volba). To zkontroluje všechny existující řádky před povolením omezení.

Budete mít také možnost ne kontrola existujících dat, ale to by mělo být prováděno pouze ve výjimečných případech.

Zde je znovu stejný dotaz, ale s několika sloupci navíc pro zobrazení tabulek a odkazovaných tabulek:

SELECT 
  name AS 'Constraint',
  OBJECT_NAME(parent_object_id) AS 'Table',
  OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Výsledek:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+

  1. Jak povolit trasování v aplikacích Oracle r12

  2. Oracle sql pro počítání instancí různých hodnot v jednom sloupci

  3. Jak vypsat aktivní / otevřená připojení v Oracle?

  4. Nainstalujte SQL Server 2019 na Mac