Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Zurückgeben aller Fremdschlüssel und CHECK-Einschränkungen in einer SQL Server-Datenbank (T-SQL-Beispiele)

In SQL Server können Sie Transact-SQL verwenden, um eine Liste aller Fremdschlüssel und CHECK zurückzugeben Beschränkungen für die aktuelle Datenbank.

Die Beispiele auf dieser Seite fragen zwei Systemansichten ab, um diese Informationen abzurufen: sys.foreign_keys und sys.check_constraints . Sie können jeden einzeln abfragen oder UNION verwenden um sie alle in einem einzigen Ergebnissatz anzuzeigen.

Beispiel 1 – Kombinierter Ergebnissatz

In diesem Beispiel verwende ich UNION um Fremdschlüssel zurückzugeben und CHECK Beschränkungen in der gleichen Ergebnismenge.

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

Ergebnis:

+------------------+--------------------------------+------------------------+---------------+------------------+
| Table            | Constraint                     | type_desc              | is_disabled   | is_not_trusted   |
|------------------+--------------------------------+------------------------+---------------+------------------|
| BandMember       | FK_BandMember_Band             | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| BandMember       | FK_BandMember_Musician         | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| City             | FK_City_Country                | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| MembershipPeriod | chkValidEndDate                | CHECK_CONSTRAINT       | 0             | 0                |
| MembershipPeriod | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
+------------------+--------------------------------+------------------------+---------------+------------------+

In diesem Fall enthält die aktuelle Datenbank vier Fremdschlüssel und einen CHECK Zwang.

Wir können auch sehen, ob jede Einschränkung aktiviert oder deaktiviert ist und ob sie vertrauenswürdig ist oder nicht.

Beispiel 2 – Alle Spalten zurückgeben

Diese beiden Ansichten geben mehr Spalten zurück, als ich in diesem Beispiel aufgelistet habe. Sie können immer einen Platzhalter verwenden, um alle Spalten zurückzugeben. In diesem Fall können Sie jedoch UNION nicht verwenden , da jede Ansicht eine andere Anzahl von Spalten zurückgibt.

Daher müssen Sie sie separat abfragen. Zum Beispiel:

SELECT * FROM sys.foreign_keys;
SELECT * FROM sys.check_constraints;

Das erzeugt zwei Ergebnismengen:eine enthält die Fremdschlüssel, die andere enthält den CHECK Einschränkungen.

Um Platz zu sparen, zeige ich die Ergebnisse dieser Abfrage nicht an. Aber hier ist, was die zweite Zeile erzeugt (mit vertikaler Ausgabe, um Ihnen das horizontale Scrollen zu ersparen):

SELECT * FROM sys.check_constraints;

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
name                    | chkValidEndDate
object_id               | 1525580473
principal_id            | NULL
schema_id               | 1
parent_object_id        | 1349579846
type                    | C 
type_desc               | CHECK_CONSTRAINT
create_date             | 2019-09-11 00:33:02.587
modify_date             | 2019-09-11 00:33:02.587
is_ms_shipped           | 0
is_published            | 0
is_schema_published     | 0
is_disabled             | 0
is_not_for_replication  | 0
is_not_trusted          | 0
parent_column_id        | 0
definition              | ([EndDate]>=[StartDate])
uses_database_collation | 1
is_system_named         | 0

Sie können jede dieser Spalten in Ihre Abfrage einbeziehen, aber wenn Sie sie mit den Fremdschlüsseln kombinieren, stellen Sie sicher, dass Sie in beiden Ansichten dieselben Spalten einbeziehen.

Die sys.foreign_keys view gibt ein paar weitere Spalten zurück. Hier ist eine modifizierte Abfrage, bei der ich die erste Zeile (nach Name) aus dieser Ansicht zurückgebe.

SELECT TOP(1) * 
FROM sys.foreign_keys
ORDER BY name;

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
name                           | FK_BandMember_Band
object_id                      | 1317579732
principal_id                   | NULL
schema_id                      | 1
parent_object_id               | 1285579618
type                           | F 
type_desc                      | FOREIGN_KEY_CONSTRAINT
create_date                    | 2019-08-17 15:58:42.027
modify_date                    | 2019-08-17 15:58:42.027
is_ms_shipped                  | 0
is_published                   | 0
is_schema_published            | 0
referenced_object_id           | 1253579504
key_index_id                   | 1
is_disabled                    | 0
is_not_for_replication         | 0
is_not_trusted                 | 0
delete_referential_action      | 0
delete_referential_action_desc | NO_ACTION
update_referential_action      | 0
update_referential_action_desc | NO_ACTION
is_system_named                | 0