Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come restituire tutti i vincoli CHECK non attendibili in SQL Server (esempio T-SQL)

Se devi restituire un elenco di tutti i CHECK non attendibili vincoli in un database di SQL Server, è possibile eseguire il codice T-SQL riportato di seguito.

Con "non attendibile", mi riferisco a quei vincoli che hanno il loro is_not_trusted flag impostato su 1 .

Esempio 1 – Restituisci solo vincoli CHECK non attendibili

Questa query restituisce solo il CHECK non attendibile vincoli nel database corrente.

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

Risultato:

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

Questa query restituisce il nome del vincolo, il nome della tabella a cui è applicato e la definizione del vincolo.

Restituisce anche is_disabled colonna. Questo ci dice se il vincolo è attualmente abilitato o disabilitato. Questo può essere importante da sapere, perché un vincolo può essere abilitato ma allo stesso tempo non attendibile.

Interroga il sys.check_constraints vista del sistema. Sappiamo che restituisce solo vincoli non attendibili perché WHERE La clausola specifica solo le righe che hanno is_not_trusted colonna impostata su 1 .

Se desideri restituire tutti i attendibili CHECK vincoli, cambia semplicemente il 1 a 0 .

Esempio 2 – Stato di fiducia della restituzione

Eccolo di nuovo, ma questa volta cambio la definition colonna con is_not_trusted colonna:

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;

Risultato:

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

Probabilmente è superfluo includere is_not_trusted colonna, ma almeno aiuta a ribadire il fatto che un vincolo abilitato può ancora non essere attendibile.

Esempio 3 – Restituisci tutti i vincoli CHECK

La query seguente restituisce tutto CHECK vincoli per il database corrente (non solo quelli non attendibili):

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

Risultato:

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

Per una discussione dettagliata (ed esempi) di is_not_trusted flag, vedi Cosa dovresti sapere CON NOCHECK quando si abilita un vincolo CHECK in SQL Server.