}

Tabellen zu Views finden mit dem INFORMATION_SCHEMA

Beim Analysieren von Datenbanken, deren Struktur man nicht kennt stellt sich oft die Frage: Welche Views referenzieren auf welche Tabellen?“ bzw. „Welche Tabellen werden von Views referenziert?“. Um diese Frage bei einer Microsoft SQL Server-Datenbank zu beantworten kann man, außer den entsprechenden Views im sys–Schema, auch die View VIEW_TABLE_USAGE aus dem INFORMATION_SCHEMA–Schema verwenden. Diese ist genau dazu gedacht die Frage nach den Abhängigkeiten zwischen Views und Tabellen zu beantworten und deshalb sehr einfach zu verwenden.
Mit dem folgende einfachen SQL-Statement erhält man die Information zu den Abhängigkeiten zwischen Tabellen und Views:

SELECT
   vtu.VIEW_SCHEMA, vtu.VIEW_NAME, vtu.TABLE_SCHEMA, vtu.TABLE_NAME
FROM
    INFORMATION_SCHEMA.VIEW_TABLE_USAGE AS vtu

Wenn das gleiche Ergebnis mit den Views aus dem sys–Schema erzeugt werden soll, ist hingegen das deutlich umfangreichere folgende SQL notwendig:

SELECT DISTINCT
    viewSchema.name AS VIEW_SCHEMA,
    v.name AS VIEW_NAME,
    refSchema.name AS TABLE_SCHEMA,
    refObj.name AS TABLE_NAME
FROM
    sys.sql_dependencies AS sd
INNER JOIN
    sys.views AS v
        ON v.object_id = sd.object_id
LEFT OUTER JOIN
    sys.schemas AS viewSchema
        ON v.schema_id = viewSchema.schema_id
LEFT OUTER JOIN
    sys.objects AS refObj
        ON sd.referenced_major_id = refObj.object_id
LEFT OUTER JOIN
    sys.schemas AS refSchema
        ON refObj.schema_id = refSchema.schema_id
WHERE
    sd.class IN (0,1)

Neben der einfachen Anwendung hat das INFORMATION_SCHEMA auch den Vorteil, dass es im SQL-92 Standard definiert ist. Dadurch ermöglicht es eine gewisse Portabilität. So wird das INFORMATION_SCHEMA–Schema neben Microsoft SQL Server auch von MySQL und PostgreSQL unterstütz.

Der Nachteil des INFORMATION_SCHEMA–Schema ist, dass es nicht alle Informationen die im sys–Schema in SQL Server vorhanden sind enthält.

Wenn es aber darum geht einfach und schnell die Frage welche Views auf welche Tabellen zugreifen zu beantworten ist die View INFORMATION_SCHEMA.VIEW_TABLE_USAGE meiner Meinung nach die einfachste Möglichkeit.