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

Jak povolit omezení CHECK v SQL Server (příklad T-SQL)

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í.


  1. Jak získám desetinná místa při zaokrouhlování průměru v SQL

  2. Obnovení SQL Server 2017

  3. 10 užitečných tipů pro ladění výkonu MySQL

  4. Je lepší používat více databází s jedním schématem, nebo jednu databázi s více schématy?