3.6 SQLcl LiquibaseおよびDBMS_METADATA
Oracle Databaseパッケージによる動的オブジェクト変換
Oracleには、データベース機能を拡張する多数のパッケージ(Oracle Databaseとともに自動的にインストールされる)が用意されています。これらのパッケージの1つであるDBMS_METADATA
は、データベース・ディクショナリからメタデータをXMLまたはSQLデータ定義言語(DDL)文として取得し、XMLを発行してオブジェクトを再作成する方法を提供します。
Oracle SQLcl Liquibaseは、DBMS_METADATA
パッケージを使用して、データベース・オブジェクトの状態を動的に変換する特殊な変更ログを生成および実行します。これは、Liquibaseオープンソース・クライアントでは使用できません。generate-schema
などのSQLcl専用のLiquibaseコマンドを使用して、完全なOracleデータベース・スキーマを更新できます。これには、変更ログの仕様に従った、すでに存在する表およびその他のオブジェクトの変更が含まれます。オープンソースのLiquibaseで、既存の表を示す変更ログに対してupdate
コマンドを実行すると、失敗します。これは、オープンソースのLiquibaseが既存のオブジェクトを変更できないためです。
generate-schema
やgenerate-object
などのコマンドから生成されるSQLcl Liquibaseの特殊な変更ログでは、DBMS_METADATA
パッケージのSXMLデータ形式を使用して、これらの動的更新を実行します。SXMLは、SQL DDLをXMLに直接変換するように見えるオブジェクト・メタデータのXML表現です。
この項では、いくつかの例を使用してこの概念を示します。この例では、Windowsベースのオペレーティング・システムが使用されています。
例1
SQLclリリース22.3でOracleデータベースに接続します。この例で紹介されている表には、いくつかのサンプル表が含まれています。この例で使用する表は、employeesとdepartmentsです。
SQL> select table_name from user_tables;
TABLE_NAME
_____________
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
HIRE_DATE
PERSON_COLLECTION
COUNTRIES
9 rows selected.
- SQLcl Liquibaseを使用して、データベース状態のスキーマを生成します。
SQL> lb generate-schema
-
別のコマンドライン・ウィンドウに切り替えて、オープンソースのLiquibaseクライアントを使用してデータベース状態の変更ログを生成します。generate-schemaは拡張機能を使用するSQLcl専用コマンドであるため、オープンソースのLiquibaseクライアントは
generate-changelog
コマンドを使用する必要があります。ノート:
オープンソースのLiquibaseクライアントをLiquibase Webサイトからダウンロードできます。>liquibase --changelog-file=sql_test.xml generate-changelog
データベースの状態は、SQLcl LiquibaseとオープンソースのLiquibaseクライアントの両方で取得されるようになりました。
- SQLclコマンドライン・ウィンドウで、データベースにいくつか変更を加えます。
データベース内のこれらの列の追加を表示します。SQL>alter table employees add height number; Table EMPLOYEES altered. SQL>alter table employees add mood varchar2(50); Table EMPLOYEES altered. SQL>alter table departments add happiness varchar2(50); Table DEPARTMENTS altered.
SQL> select * from departments; SQL> select * from employees;
-
データベースを変更ログの状態に変更するには、Liquibase
update
コマンドを使用する必要があります。これは、employeesおよびdepartments表に追加の列が追加されていないデータベースの状態です。これを行うには、SQLclに接続されておらず、オープンソースのLiquibaseクライアント・コマンドの実行に使用されたコマンドライン・ウィンドウで、次のコマンドを入力します。
>liquibase --changelog-file=sql_test.xml update
Liquibaseが、表などのデータベース内にすでに存在するオブジェクトを検出したため、updateコマンドが失敗します。この標準バージョンのLiquibaseでは、これらのオブジェクトは動的に処理されません。
-
SQLclコマンドライン・ウィンドウで、同じステップがSQLcl Liquibaseで繰り返されます。
最初に、
update-sql
コマンドを使用してスキーマの更新を完了するために使用されるSQLを確認します。SQL>lb update-sql -changelog-file controller.xml
出力を確認すると、departments表とemployees表が認識され、作成した追加の列を削除して変更ログの状態に戻す必要があることがわかります。
実際により複雑なユースケースでは、多くの場合、SQLの
drop
コマンドに関連するリスクがあります。update-sql
コマンドを使用してSQLコードを調べると、確認に役立ちます。その後、手動で変更セットを変更し、必要に応じてチェックできます。updateコマンドを実行すると、スキーマが正常に更新され、列が削除されます。
SQL> lb update -changelog-file controller.xml --Starting Liquibase at 68:23:55 (version xml 4.15.0 #0 built at 2022-08-19 14:45+0000) -- Loaded 38 change(s)
例2
この例でも、同じ概念について説明し、今回は列と表を追加します。
この例では、データベース内の表Activities
が、departments
表の列Head_Count
とRetention
、およびemployees
表のAwards
とともにすでに作成されています。

変更ログが生成され、Activities
表およびHead_count
、Retention
およびcolumns
が削除されて、Liquibaseを使用してそれらを作成するように表示されます。
-
SQLclでスキーマを生成します。
ノート:
前述の例の変更ログを別のフォルダに移動して、問題を回避します。SQL> lb generate-schema --Starting Liquibase at 09:33:52 (version 4.15.0 #0 built at 2022-08-19 14:45+0000)
-
別のコマンドライン・ウィンドウに切り替えて、オープンソースのLiquibaseクライアントでコマンドを実行します。ここで、変更ログも生成します。
>liquibase --changelog-file=sql_test2.xml generate-changelog
-
SQLclコマンドライン・ウィンドウで、
Activities
表およびHead_count
、Retention
およびAwards
列を削除して、それらの作成をupdateコマンドで確認できるようにします。SQL> drop table activities; Table ACTIVITIES dropped. SQL> alter table employees drop column awards; Table EMPLOYEES altered. SQL> alter table departments drop column head_count; Table DEPARTMENTS altered. SQL> alter table departments drop column retention; Table DEPARTMENTS altered.
-
オープンソースのLiquibaseコマンドライン・ウィンドウで、updateコマンドを実行します。
> liquibase --changelog-file=sql_test2.xml update
Liquibaseが既存のオブジェクトを検出すると、更新は失敗します。
-
SQLclコマンドライン・ウィンドウで、確認するためのSQLを生成し、SQLcl Liquibaseで更新を実行します。
SQL>lb update-sql -changelog-file controller.xml
SQL出力で、
Activities
表の作成およびSQLcl LiquibaseがSQL文を生成したことに関するセクションを確認し、列を追加するためにDepartments
表およびEmployees
表を変更できます。 -
更新を実行して、表および列が追加されていることを確認します。
SQL> lb update -changelog-file controller.xml
SQL>select table_name from user_tables; SQL>select * from employees; SQL>select * from departments; SQL> select table_name from user_tables; TABLE_NAME _____________ REGIONS LOCATIONS DEPARTMENTS JOBS EMPLOYEES JOB_HISTORY DATABASECHANGELOG_ACTIONS DATABASECHANGELOG ACTIVITIES COUNTRIES 11 rows selected.