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

Jak vrátit všechna nedůvěryhodná omezení CHECK v SQL Server (příklad T-SQL)

Pokud potřebujete vrátit seznam všech nedůvěryhodných CHECK omezení v databázi SQL Server, můžete spustit kód T-SQL níže.

Termínem „nedůvěryhodný“ mám na mysli ta omezení, která mají svá is_not_trusted příznak nastaven na 1 .

Příklad 1 – Vrácení pouze nedůvěryhodných CHECK omezení

Tento dotaz vrací pouze nedůvěryhodný CHECK omezení v aktuální databázi.

SELECT 
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled,
  definition
FROM sys.check_constraints
WHERE is_not_trusted = 1;

Výsledek:

+----------------+-----------------+---------------+-------------------------------+
| Table          | Constraint      | is_disabled   | definition                    |
|----------------+-----------------+---------------+-------------------------------|
| ConstraintTest | chkPrice        | 0             | ([Price]>(0))                 |
| ConstraintTest | chkValidEndDate | 1             | ([EndDate]>=[StartDate])      |
| Occupation     | chkJobTitle     | 1             | ([JobTitle]<>'Digital Nomad') |
+----------------+-----------------+---------------+-------------------------------+

Tento dotaz vrátí název omezení, název tabulky, na kterou se vztahuje, a definici omezení.

Vrátí také is_disabled sloupec. To nám říká, zda je omezení aktuálně povoleno nebo zakázáno. To může být důležité vědět, protože omezení může být povoleno, ale zároveň nedůvěryhodné.

Dotazuje se na sys.check_constraints systémový pohled. Víme, že vrací pouze nedůvěryhodná omezení, protože WHERE klauzule specifikuje pouze řádky, které mají is_not_trusted sloupec nastaven na 1 .

Pokud chcete vrátit všechny důvěryhodné CHECK omezení, jednoduše změňte 1 na 0 .

Příklad 2 – Návrat stavu důvěryhodnosti

Tady je to znovu, ale tentokrát jsem vyměnil definition sloupec s is_not_trusted sloupec:

SELECT 
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.check_constraints
WHERE is_not_trusted = 1;

Výsledek:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Pravděpodobně je zbytečné uvádět is_not_trusted sloupec, ale alespoň to pomáhá zopakovat skutečnost, že povolené omezení může být stále nedůvěryhodné.

Příklad 3 – Vrátit všechna omezení KONTROLY

Následující dotaz vrátí vše CHECK omezení pro aktuální databázi (nejen ty nedůvěryhodné):

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

Výsledek:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Pro podrobnou diskusi (a příklady) is_not_trusted příznak, viz Co byste měli vědět o WITH NOCHECK při povolení omezení CHECK v SQL Server.


  1. Agregační funkce v MySQL – seznam (jako LISTAGG v Oracle)

  2. Vložit nebo aktualizovat Android SQLite

  3. O výhodách tříděných cest

  4. Jak aktualizovat dvě tabulky v jednom příkazu v SQL Server 2005?