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 | +--------------------------------+------------------+---------------------+---------------+------------------+