3.10 Liquibase設定のヒント
3.10.2 接続スキーマとは異なるスキーマでのデータベース・オブジェクトの作成
SQLcl Liquibaseを使用すると、接続しているデータベース・ユーザー・スキーマとは異なるデータベース・ユーザー・スキーマにデプロイメントできます。ただし、ターゲット・ユーザー・スキーマに必要な権限が必要です。
liquibase updateコマンドには、これに関連する3つの重要なパラメータがあります。
-output-default-schema|-oudsデータ定義言語(DDL) SQLを実行してデータベース・オブジェクトを作成または変更するときに、スキーマを出力するかどうかを制御します。
-
-output-default-schema trueが設定されている場合、スキーマが含まれます。create table storefront.merchandise … -
-output-default-schema falseが設定されているか、-output-default-schemaがまったく設定されていない場合、スキーマは含まれません。create table merchandise …
データベース・オブジェクトを接続スキーマとは異なるスキーマにデプロイするには、
-output-default-schema trueを設定して、-default-schema-nameを使用してオブジェクトを作成するスキーマを指定できるようにする必要があります。-
-default-schema-name|-desn-output-default-schema trueが設定されている場合、-desnパラメータは出力されるスキーマを制御します。このパラメータを使用して、データベース・オブジェクトを作成するスキーマを指定します。たとえば、test_userに接続していて、表をstorefrontに作成する場合、コマンドは次のようになります。
liquibase update -changelog-file merchandise_table.xml -output-default-schema true -default-schema-name storefront-output-default-schema trueが設定されていて、-default-schema-nameが設定されていない場合、スキーマ出力は変更ログ・ファイル内の変更セットのownerName属性に基づきます。<n0:createSxmlObject objectName="Merchandise" objectType="TABLE" ownerName="LBUSER" replaceIfExists="false" >ownerNameが設定されていない場合、接続先のスキーマが使用されます。-liquibase-schema-name|-lbsnSQLclのLiquibase機能の大きな利点の1つは、変更を追跡および管理する機能です。これは主に、Liquibaseの実行時にスキーマで自動的に作成および更新される
databasechangelog追跡表で行われます。-liquibase-schema-nameを使用すると、databasechangelog表を介してLiquibase追跡情報を更新するスキーマを制御できます。これにより、データベース・オブジェクト自体を他のスキーマに適用しながら、すべてのLiquibase変更情報を追跡する制御スキーマまたはユーザーを持つなどのユースケースを設定できます。
たとえば、ユーザーまたはスキーマstorefrontに接続し、merchandise_table.xml変更ログ・ファイルを使用して商品表を作成します。ただし、Liquibaseでは、このスキーマにdatabasechangelog表を作成しません。追跡情報を、スキーマcontrol_userの既存のdatabasechangelog表に格納します。
次のコマンドでこれを実行できます。
liquibase update -changelog-file merchandise_table.xml -liquibase-schema-name control_userノート:
Storefrontには、control_userのdatabasechangelog、databasechangeloglockおよびdatabasechangelog_actions表に対する書込み権限が必要です。GRANT SELECT, INSERT, UPDATE, DELETE ON CONTROL_USER.DATABASECHANGELOG TO STOREFRONT; GRANT SELECT, INSERT, UPDATE, DELETE ON CONTROL_USER.DATABASECHANGELOGLOCK TO STOREFRONT; GRANT SELECT, INSERT, UPDATE, DELETE ON CONTROL_USER.DATABASECHANGELOG_ACTIONS TO STOREFRONT;