データベースオブジェクト間の依存関係とは、データベースオブジェクト間の依存関係や参照関係を記述するものです。本記事では、OceanBaseデータベースのOracleモードにおいて、データベースオブジェクト間の依存関係を作成および確認する方法について説明します。
データベースオブジェクト間の依存関係の作成と確認
特定の種類のスキーマオブジェクトは、その定義内で他のオブジェクトを参照することができます。例えば、ビューの定義はテーブルや他のビューを参照するクエリである場合があります。また、ストアドプロシージャのプロセス本体に含まれるSQL文は、データベース内の他のオブジェクトを参照することができます。オブジェクトAの定義がオブジェクトBを参照している場合、Aは(Bの)依存オブジェクトであり、Bは(Aの)参照オブジェクトです。
データベースオブジェクト間の依存関係は、特定のシナリオでは非常に有用です。例えば、データベース移行のシナリオでは、別のデータベースでスキーマオブジェクトを再構築する必要があります。再構築するスキーマオブジェクトがビューの場合、そのビューが依存する他のオブジェクトを先に再構築しなければなりません。そうでないと、ビューを再構築する際に「依存するオブジェクトが存在しない」というエラーが発生します。データベースオブジェクト間の依存関係を取得できれば、オブジェクトの再構築作業を容易に完了できます。
データベースオブジェクト間の依存関係の作成に成功した後、USER_DEPENDENCIES、ALL_DEPENDENCIES、DBA_DEPENDENCIESの各ビューを使用して、データベースオブジェクト間の依存関係を確認できます。
例1: ビューview2を作成します。このビューは、テーブルtbl1と別のビューview1を参照します。
obclient> CREATE TABLE tbl1(col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE tbl2 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> CREATE VIEW view1 AS SELECT * FROM tbl2;
Query OK, 0 rows affected
obclient> CREATE VIEW view2 AS SELECT t.col1 AS col1, t.col2 AS col2 FROM tbl1 t, view1 v WHERE
t.col1 = v.col2;
Query OK, 0 rows affected
例2:USER_DEPENDENCIESビューを使用して、データベースオブジェクト間の依存関係を確認します。
obclient> SELECT * FROM USER_DEPENDENCIES;
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
| NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | REFERENCED_LINK_NAME | SCHEMAID | DEPENDENCY_TYPE |
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
| VIEW1 | VIEW | SYS | TBL2 | TABLE | NULL | 1100611139403782 | HARD |
| VIEW2 | VIEW | SYS | TBL1 | TABLE | NULL | 1100611139403782 | HARD |
| VIEW2 | VIEW | SYS | VIEW1 | VIEW | NULL | 1100611139403782 | HARD |
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
3 rows in set
上記の例では、ビューのクエリ結果にデータベースオブジェクト間の依存関係が記述されています。例えば、ビューview1はテーブルtbl2を参照し、ビューview2はテーブルtbl1と別のビューview1を参照します。
注意事項
データベースオブジェクト間の依存関係は、データベース内でリアルタイムかつ絶対的に正確なものとして維持されているわけではありません。参照先のオブジェクトが削除または再作成された場合、その依存関係の更新は次回の依存オブジェクトへのクエリまたはDMLトリガーによって行われます。
以下の例では、テーブル tbl1 を参照するビュー view1 を作成します。テーブル tbl1 を削除した後でも、USER_DEPENDENCIESビューを照会すると、それらの間の依存関係を確認できます。ビュー view1 に対してDML操作が一度実行されると、再度USER_DEPENDENCIESビューを照会すると、それらの間の依存関係が削除されていることがわかります。
obclient> CREATE TABLE tbl1 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> CREATE VIEW view1 AS SELECT * FROM tbl1;
Query OK, 0 rows affected
obclient> SELECT * FROM USER_DEPENDENCIES;
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
| NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | REFERENCED_LINK_NAME | SCHEMAID | DEPENDENCY_TYPE |
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
| VIEW1 | VIEW | SYS | TBL1 | TABLE | NULL | 1100611139403782 | HARD |
+------+------+------------------+-----------------+-----------------+----------------------+------------------+-----------------+
1 row in set
obclient> DROP TABLE tbl1;
Query OK, 0 rows affected
obclient>SELECT * FROM USER_DEPENDENCIES;
+------+------+------------------+------------------------------+-----------------+----------------------+------------------+-----------------+
| NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | REFERENCED_LINK_NAME | SCHEMAID | DEPENDENCY_TYPE |
+------+------+------------------+------------------------------+-----------------+----------------------+------------------+-----------------+
| VIEW1 | VIEW | __recyclebin | RECYCLE_$_1_1635668004963688 | TABLE | NULL | 1100611139403782 | HARD |
+------+------+------------------+------------------------------+-----------------+----------------------+------------------+-----------------+
1 row in set
obclient> SELECT * FROM view1;
OBE-04063: view 'SYS.view1' has errors
obclient>SELECT * FROM USER_DEPENDENCIES;
Empty set