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

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

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

Una chiave esterna non attendibile è quella che ha il suo is_not_trusted flag impostato su 1 .

Esempio 1 – Restituisci solo vincoli di chiave esterna non attendibili

Questa query restituisce solo i vincoli di chiave esterna non attendibili nel database corrente. Per questo esempio, restituisco solo il nome del vincolo, il suo stato attendibile, insieme allo stato abilitato/disabilitato.

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

Risultato:

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

Questo interroga sys.foreign_keys 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 vuoi restituire solo fidato vincoli di chiave esterna, cambia semplicemente il 1 a 0 .

Ho incluso anche is_disabled flag, perché ci mostra se il vincolo è attualmente abilitato o meno. Possiamo vedere che uno dei vincoli è abilitato e l'altro no.

Ciò dimostra il fatto che un vincolo può non essere attendibile anche quando è abilitato. Questo perché, quando abiliti (o crei) un vincolo, hai la possibilità di farlo controllare tutti i dati esistenti prima che sia abilitato. Se scegli di non controllare i dati esistenti, il vincolo rimarrà non attendibile una volta abilitato.

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_not_trusted = 1;

Risultato:

+------------------------+------------+--------------------+---------------+------------------+
| Constraint             | Table      | Referenced Table   | is_disabled   | is_not_trusted   |
|------------------------+------------+--------------------+---------------+------------------|
| FK_BandMember_Band     | BandMember | Band               | 1             | 1                |
| FK_BandMember_Musician | BandMember | Musician           | 0             | 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 quelli non attendibili):

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

Risultato:

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