Pokud máte CHECK
omezení na serveru SQL Server, které je aktuálně zakázáno, můžete jej znovu povolit pomocí kódu níže.
Když povolíte CHECK
omezení (nebo omezení cizího klíče v tomto případě), máte možnost určit, zda chcete nebo nechcete kontrolovat jakákoli existující data v tabulce.
Níže jsou uvedeny příklady kódu pro povolení CHECK
omezení a přitom specifikujte každou z těchto různých možností.
Příklad 1 – Povolte omezení pomocí WITH CHECK
Toto je doporučená metoda aktivace CHECK
omezení (pokud nemáte konkrétní důvod jej nepoužívat).
Zde je příklad povolení omezení zvaného chkJobTitle
:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
Zde výslovně uvádím WITH CHECK
, který říká serveru SQL Server, aby zkontroloval existující data před povolením omezení. Pokud některá data porušují omezení, omezení nebude povoleno a zobrazí se chyba.
To je dobré, protože to vynucuje integritu dat.
Když vytvoříte nový CHECK
omezení, toto je výchozí nastavení. Když však povolíte existující omezení (jak to děláme zde), není výchozí nastavení.
Příklad 2 – Povolte omezení pomocí WITH NOCHECK
V tomto příkladu je omezení povoleno bez kontroly existujících dat:
ALTER TABLE Occupation WITH NOCHECK CHECK CONSTRAINT chkJobTitle;
Zde výslovně uvádím WITH NOCHECK
, který říká SQL Serveru, aby nekontroloval existující data. To znamená, že omezení bude povoleno, i když tabulka již obsahuje data, která omezení porušují.
Toto je výchozí nastavení při povolení omezení (ale ne při vytváření omezení).
Jeden z mála důvodů (pravděpodobně jediný důvod), proč byste to použili, je, pokud chcete v databázi ponechat neplatná data. Možná máte jednorázovou výjimku, kdy musíte zadat řádek nebo více neplatných dat, ale požadujete, aby všechna budoucí data odpovídala omezení.
Stále však existují rizika spojená s tím. Zde je to, co k tomu říká společnost Microsoft:
Nedoporučujeme to dělat, s výjimkou vzácných případů. Nové omezení je vyhodnoceno ve všech pozdějších aktualizacích dat. Jakákoli porušení omezení, která jsou potlačena pomocí
WITH NOCHECK
Když je omezení přidáno, může to způsobit selhání budoucích aktualizací, pokud aktualizují řádky daty, která omezení nedodržují.
Takže pomocí WITH NOCHECK
může později způsobit problémy.
Příklad 3 – Povolení omezení pomocí výchozí možnosti
Zde je příklad použití výchozí možnosti:
ALTER TABLE Occupation CHECK CONSTRAINT chkJobTitle;
Tento příklad je ekvivalentem předchozího příkladu. Protože jsem nespecifikoval, zda zkontrolovat nebo ne, SQL Server předpokládá, že chci WITH NOCHECK
.
Použití WITH NOCHECK odstraňuje důvěru
Když povolíte omezení pomocí WITH NOCHECK
Jedním z důsledků, o kterém byste si měli být vědomi, je, že SQL Server již tomuto omezení nedůvěřuje. Označí jej jako nedůvěryhodný.
Ano čtete správně. Ve skutečnosti existuje is_not_trusted
příznak, který SQL Server nastaví na 1
když deaktivujete CHECK
omezení (což znamená, že není důvěryhodné) a jediný způsob, jak jej nastavit na 0
(důvěryhodný) je zadat WITH CHECK
při opětovném povolení omezení. Pomocí WITH NOCHECK
prostě to neškrtne.
To dává dokonalý smysl. Koneckonců, vy důvěřovat omezení, které nezkontrolovalo všechna data?
Pomocí WITH CHECK
, zajistíte, že omezení zkontroluje všechna existující data před jeho aktivací. Jediným způsobem, jak jej lze povolit, je, že všechna existující data vyhovují omezení. Jakmile zkontroluje všechna existující data, může být důvěryhodný.
Další informace o tomto naleznete v části Co byste měli vědět o WITH NOCHECK při povolování omezení CHECK na serveru SQL, kde můžete vidět skutečné is_not_trusted
příznak se přepíná tam a zpět pokaždé, když deaktivuji a znovu povolím CHECK
omezení.