Freitag, 28. Februar 2014

Beziehungen zwischen Tabellen dokumentieren

"Herzlichen Glückwunsch - Sie haben eine Datenbank gewonnen!" Mit diesen Worten bekam ich vor einigen Jahren anlässlich der Verabschiedung eines Kollegen die Verantwortung für den Betrieb und die Weiterentwicklung einer Datenbank überreicht. Wie Sie sich vorstellen können, hatte ich daraufhin erst einmal einiges an Arbeit, um mir einen Überblick über Art und Umfang des "Geschenks" zu verschaffen.

Beziehungen automatisch dokumentieren


Insbesondere um die existierenden Abfragen gegen die nicht so gut dokumentierte Datenbank zu verstehen und weiterentwickeln zu können, brauchte ich schnell eine Zusammenstellung der Beziehungen zwischen den Tabellen:
  • von Tabelle
  • nach Tabelle
  • Namen der Primär- und Fremdschlüsselspalten
Die folgende Abfrage auf Basis der Sichten in INFORMATION_SCHEMA hat mir dabei sehr geholfen.


SELECT FKT.TABLE_NAME AS FK_Table -- Fremdschlüssel-Tabelle
,CU.COLUMN_NAME AS FK_Column -- Fremdschlüssel-Spalte
,PKT.TABLE_NAME AS PK_Table -- Primärschlüssel-Tabelle
,PKT1.COLUMN_NAME AS PK_Column -- Primärschlüssel-Spalte
,C.CONSTRAINT_NAME AS Constraint_Name -- Name des Constraints
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FKT
  ON C.CONSTRAINT_NAME = FKT.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PKT
  ON C.UNIQUE_CONSTRAINT_NAME = PKT.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
  ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
  SELECT TCI.TABLE_NAME
    ,CUI.COLUMN_NAME
    ,CUI.ORDINAL_POSITION
  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TCI
  INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CUI
    ON TCI.CONSTRAINT_NAME = CUI.CONSTRAINT_NAME
  WHERE TCI.CONSTRAINT_TYPE = 'PRIMARY KEY'
  ) PKT1
  ON PKT1.TABLE_NAME = PKT.TABLE_NAME
    AND PKT1.ORDINAL_POSITION = CU.ORDINAL_POSITION

Aus SQL-Sicht ist daran interessant, dass die Tabellen TABLE_CONSTRAINTS und KEY_COLUMN_USAGE mehrfach vorkommen, aber in unterschiedlichen Rollen. Durch Vergabe unterschiedlicher Alias-Namen für dieselbe Tabelle (FKT, PKT, TCI bzw. CU, CUI) wird das unterschieden. So, als handle es sich jedes Mal um eine andere Tabelle. Eine Technik, die Sie immer dann anwenden können, wenn dieselbe Tabelle in einer Abfrage unterschiedliche Rollen einnimmt.