ビューで使用しているテーブルを調べたいときがあると思います。しかしMySQLはOracleのALL_DEPENDENCIESテーブルなどの依存関係を調べるディクショナリビューがありません。そのため、MySQLではVIEWのDDL文が格納されているINFORMATION_SCHEMA.VIEWSビューとTABLE(VIEWを含む)の定義情報が格納されているINFORMATION_SCHEMA.TABLESビューを使用して半ば強引に調べる必要があります。
VIEWの依存関係を調べるスクリプト(1階層のみ)
依存関係を調べるSQLスクリプトはこうなります。
SELECT UPPER(V.TABLE_SCHEMA) SCHEMA_NAME
, UPPER(V.TABLE_NAME) VIEW_NAME
, UPPER(T.TABLE_NAME) TABLE_NAME
, T.TABLE_TYPE TYPE
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.VIEWS V
ON V.TABLE_SCHEMA = T.TABLE_SCHEMA
AND V.VIEW_DEFINITION LIKE CONCAT('%`',T.TABLE_NAME,'`%')
WHERE T.TABLE_SCHEMA = DATABASE()
AND V.TABLE_NAME = UPPER('V_D')
;
10行目のV.TABLE_NAMEに調査対象のVIEW名を指定してください。例では「V_D」という名前のVIEWを調べています。
注意点としては、接続時にDEFAULTスキーマを指定している必要があります。DEFAULTスキーマを指定していない場合、9行目の「DATABASE()」は調査対象のスキーマ名(DB名)を指定してください。
実行結果はこのような形で取得できます。

今回調査した「V_D」というビューはT_Hテーブル、T_Mテーブル、V_Uビューで構成されているのが分かります。
「VIEW_NAME」列には調査対象のVIEW名が出力されます。「TABLE_NAME」列には依存関係があるTABLE名またはVIEW名が出力されます。「TYPE」列は「TABLE_NAME」
上で紹介したSQLスクリプトでは、VIEWで使用されているVIEWの依存関係までは調査することが出来ません。(上の例だとV_Uビューが使用しているテーブルまでは調べていません。)
VIEWの依存関係を調べるスクリプト(改良版:複数階層調査)
VIEWで使用されているVIEWの依存関係まで調査する場合、再帰クエリを使用して「TYPE」列がVIEWの情報に対しては再度VIEWの依存関係を調査します。再帰クエリを使用する為、作成されているTABLEやVIEWの数が多いと少し時間が掛かります。再帰的に調査するSQLスクリプトはこうなります。
WITH RECURSIVE VIEW_REC AS (
SELECT UPPER(V.TABLE_SCHEMA) SCHEMA_NAME
, 1 HIERARCHY
, UPPER(V.TABLE_NAME) VIEW_NAME
, UPPER(T.TABLE_NAME) TABLE_NAME
, T.TABLE_TYPE TYPE
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.VIEWS V
ON V.TABLE_SCHEMA = T.TABLE_SCHEMA
AND V.VIEW_DEFINITION LIKE CONCAT('%`',T.TABLE_NAME,'`%')
WHERE T.TABLE_SCHEMA = DATABASE()
AND V.TABLE_NAME = UPPER('V_D')
UNION ALL
SELECT UPPER(V.TABLE_SCHEMA) SCHEMA_NAME
, HIERARCHY + 1 AS HIERARCHY
, UPPER(V.TABLE_NAME) VIEW_NAME
, UPPER(T.TABLE_NAME) TABLE_NAME
, T.TABLE_TYPE TYPE
FROM INFORMATION_SCHEMA.TABLES T
INNER JOIN INFORMATION_SCHEMA.VIEWS V
ON V.TABLE_SCHEMA = T.TABLE_SCHEMA
AND V.VIEW_DEFINITION LIKE CONCAT('%`',T.TABLE_NAME,'`%')
INNER JOIN VIEW_REC R
ON V.TABLE_SCHEMA = R.SCHEMA_NAME
AND V.TABLE_NAME = R.TABLE_NAME
)
SELECT * FROM VIEW_REC
ORDER BY HIERARCHY
, VIEW_NAME
;
先ほどと同様に12行目のV.TABLE_NAMEに調査対象のVIEW名を指定してください。注意点も先ほどと同じです。DEFAULTスキーマを指定していない場合、11行目の「DATABASE()」は調査対象のスキーマ名(DB名)を指定してください。
実行結果はこのような形で取得できます。

「V_U」ビューが使用している「M_USER」テーブルが調査できているのが分かります。「HIERARCHY」列は階層の深さを出力しています。HIERARCHYが1の行は調査対象のVIEW
から直接使用しているTABLEまたはVIEWになります。
参考情報
MySQLの再帰クエリは以下のリファレンスサイトが参考になります。

コメント