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

Come restituire tutti i vincoli di chiave esterna disabilitati in SQL Server (esempio T-SQL)

Se è necessario restituire un elenco di tutti i vincoli di chiave esterna che sono stati disabilitati in un database di SQL Server, è possibile eseguire il codice T-SQL riportato di seguito.

Esempio 1 – Restituisce solo vincoli di chiave esterna disabilitati

Questa query restituisce solo i vincoli di chiave esterna disabilitati nel database corrente. Per questo esempio, restituisco solo il nome del vincolo, insieme al suo stato disabilitato e attendibile.

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys
WHERE is_disabled = 1;

Risultato:

+------------------------+---------------+------------------+
| Constraint             | is_disabled   | is_not_trusted   |
|------------------------+---------------+------------------|
| FK_BandMember_Band     | 1             | 1                |
| FK_BandMember_Musician | 1             | 1                |
+------------------------+---------------+------------------+

Questo interroga sys.foreign_keys vista del sistema. Sappiamo che restituisce solo vincoli disabilitati perché WHERE La clausola specifica solo le righe che hanno il is_disabled colonna impostata su 1 .

Se vuoi restituire solo abilitati vincoli di chiave esterna, cambia semplicemente il 1 a 0 .

Nota che il is_not_trusted flag è anche impostato su 1 per questi vincoli disabilitati. Questo perché il sistema non può garantire che il vincolo abbia verificato tutti i dati. Questo ha senso, perché la disabilitazione di un vincolo apre la possibilità che dati non validi entrino nel database senza essere controllati.

Ecco di nuovo la stessa query, ma questa volta includo la tabella e la tabella di riferimento per ogni vincolo:

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

Risultato:

+------------------------+------------+--------------------+---------------+------------------+
| Constraint             | Table      | Referenced Table   | is_disabled   | is_not_trusted   |
|------------------------+------------+--------------------+---------------+------------------|
| FK_BandMember_Band     | BandMember | Band               | 1             | 1                |
| FK_BandMember_Musician | BandMember | Musician           | 1             | 1                |
+------------------------+------------+--------------------+---------------+------------------+

Esempio 2 – Restituisci tutti i vincoli di chiave esterna

La query seguente restituisce tutto vincoli di chiave esterna per il database corrente (non solo per quelli disabilitati):

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Risultato:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 1             | 1                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+