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

Jak zakázat omezení CHECK v SQL Server (příklady T-SQL)

Když se pokusíte zadat data do tabulky, která má plně povolenou možnost CHECK omezení, budete úspěšní pouze tehdy, pokud data toto omezení neporuší. Pokud se pokusíte zadat neplatná data, operace selže s chybou.

Ale co když se ocitnete v situaci, kdy opravdu musíte vložte data, která poruší CHECK omezení? Možná již omezení neplatí, nebo možná máte výjimku, kdy jeden řádek může omezení obejít. V každém případě nebudete moci zadat nic mimo pravidla omezení.

Pokud se ocitnete v této situaci, vždy můžete omezení deaktivovat. Zde je návod, jak to udělat pomocí Transact-SQL.

Příklad 1 – Deaktivace omezení CHECK

Chcete-li zakázat CHECK omezení, použijte NOCHECK argument v ALTER TABLE prohlášení.

Takhle:

ALTER TABLE Occupation  
NOCHECK CONSTRAINT chkJobTitle; 

Tento kód deaktivuje omezení zvané chkJobTitle .

Příklad 2 – Zkontrolujte omezení CHECK

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

SELECT 
  name,
  is_disabled,
  is_not_trusted,
  definition
FROM sys.check_constraints;

Výsledek:

+-----------------+---------------+------------------+----------------------------------------+
| name            | is_disabled   | is_not_trusted   | definition                             |
|-----------------+---------------+------------------+----------------------------------------|
| chkPrice        | 0             | 0                | ([Price]>(0))                          |
| chkValidEndDate | 0             | 0                | ([EndDate]>=[StartDate])               |
| chkTeamSize     | 0             | 0                | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle     | 1             | 1                | ([JobTitle]<>'Digital Nomad')          |
+-----------------+---------------+------------------+----------------------------------------+

V tomto případě jsem vybral všechny CHECK omezení 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 CHECK omezení nebylo ověřeno systémem pro všechny řádky.

Jinými slovy, 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 znovu povolit CHECK omezení, budete mít příležitost obnovit důvěru 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.

Podívejte se, o čem byste měli vědět S NOCHECK při povolování omezení CHECK na serveru SQL Server, kde je ukázka ovlivnění důvěryhodnosti v závislosti na tom, jak omezení znovu povolíte.


  1. Odstraňte a omezte překrývající se období

  2. Můžete rozdělit/rozložit pole v dotazu MySQL?

  3. PostgreSQL výukový program pro začátečníky – vše, co potřebujete vědět o PostgreSQL

  4. Jak přidat počet pracovních dní k danému datu