ビューで使用しているテーブルを調べたいときがあると思います。しかし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の再帰クエリは以下のリファレンスサイトが参考になります。
コメント