スポンサーリンク

MySQL VIEW依存関係(使用しているテーブル)を確認する方法

スポンサーリンク

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

MySQL :: MySQL 8.0 リファレンスマニュアル :: 13.2.15 WITH (共通テーブル式)

コメント