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.