3.10 Liquibase設定のヒント

3.10.1 変更ログを新しい環境にデプロイするときに表のプロパティを除外する方法

ある環境から表を取得し、別の環境にデプロイする場合、表の作成時にデプロイメントから除外する特定の表プロパティがあります。これは、ターゲット環境で次のようなプロパティが使用できないか望ましくないことが原因である可能性があります。

SQLclは、データベース・オブジェクトが作成または変更された(変更ログの生成元の環境ではない)ターゲット環境のデータ定義言語(DDL)セッション設定を使用して、オブジェクトのDDLを生成します。DDL設定をオフにすると、対応する表プロパティが表の作成に含まれないようにできます。

  1. 取得およびデプロイする表のLiquibase変更ログ・ファイルを生成します。
    liquibase generate-object -object-name [table name] -object-type table

    ここで示す例は、次のように定義された表を前提とします。

    CREATE TABLE "PARTITION_COMPRESSION_TABLESPACE_TEST" 
       (    "A" VARCHAR2(20) NOT NULL ENABLE, 
            "B" VARCHAR2(20), 
            "C" VARCHAR2(20) NOT NULL ENABLE, 
            CONSTRAINT "PARTITION_COMPRESSION_TABLESPACE_TEST_PK" PRIMARY KEY ("A") 
      USING INDEX 
      PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING 
      TABLESPACE "USERS" ENABLE 
       ) PCTFREE 0 PCTUSED 40 INITRANS 1 COMPRESS BASIC 
      STORAGE( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
      TABLESPACE "USERS" 
      PARTITION BY HASH ("C") 
     (PARTITION "SYS_P803" SEGMENT CREATION DEFERRED 
      COMPRESS BASIC 
      TABLESPACE "USERS");
    

    結果の変更ログからの抜粋を次に示します(パーティション、圧縮および表領域の属性が強調表示されます)。

    <?xml version="1.0" encoding="UTF-8"?>
    <databaseChangeLog 
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
    …
          <TABLE_PROPERTIES>
             <HASH_PARTITIONING>
                <COL_LIST>
                   <COL_LIST_ITEM>
                      <NAME>C</NAME>
                   </COL_LIST_ITEM>
                </COL_LIST>
                <DEFAULT_PHYSICAL_PROPERTIES>
                   <HEAP_TABLE>
                      <SEGMENT_ATTRIBUTES>
                         <PCTFREE>0</PCTFREE>
                         <PCTUSED>40</PCTUSED>
                         <INITRANS>1</INITRANS>
                         <MAXTRANS>255</MAXTRANS>
                         <STORAGE>
                            <BUFFER_POOL>DEFAULT</BUFFER_POOL>
                            <FLASH_CACHE>DEFAULT</FLASH_CACHE>
                            <CELL_FLASH_CACHE>DEFAULT</CELL_FLASH_CACHE>
                         </STORAGE>
                         <TABLESPACE>USERS</TABLESPACE>
                      </SEGMENT_ATTRIBUTES>
                      <COMPRESS>BASIC</COMPRESS>
                   </HEAP_TABLE>
                </DEFAULT_PHYSICAL_PROPERTIES>
                <PARTITION_LIST>
                   <PARTITION_LIST_ITEM>
                      <NAME>SYS_P803</NAME>
                      <SEGMENT_ATTRIBUTES>
                         <SEGMENT_CREATION_DEFERRED></SEGMENT_CREATION_DEFERRED>
                         <TABLESPACE>USERS</TABLESPACE>
                      </SEGMENT_ATTRIBUTES>
                      <COMPRESS>BASIC</COMPRESS>
                   </PARTITION_LIST_ITEM>
                </PARTITION_LIST>
             </HASH_PARTITIONING>
          </TABLE_PROPERTIES>
       </RELATIONAL_TABLE>
    </TABLE>]]></n0:source>
    </n0:createSxmlObject>
    </changeSet>
    </databaseChangeLog>
    
  2. 更新を適用して表を生成する環境では、次のDDL設定をオフにします。
    set ddl partitioning off
    set ddl segment_attributes off
    set ddl tablespace off

    パーティション化はパーティション化プロパティをオフにし、segment_attributesは圧縮プロパティをオフにし、表領域は表領域プロパティをオフにします。

    SQL> show ddl
    Parameters
    ---------------------------------------------
    BODY                           : ON
    COLLATION_CLAUSE               : NEVER
    CONSTRAINTS                    : ON
    CONSTRAINTS_AS_ALTER           : ON
    EMIT_SCHEMA                    : ON
    FORCE                          : ON
    INHERIT                        : ON
    INSERT                         : ON
    OID                            : ON
    PARTITIONING                   : OFF
    PRETTY                         : ON
    REF_CONSTRAINTS                : ON
    SEGMENT_ATTRIBUTES             : OFF
    SIZE_BYTE_KEYWORD              : ON
    SPECIFICATION                  : ON
    SQLTERMINATOR                  : ON
    STORAGE                        : ON
    TABLESPACE                     : OFF
    ---------------------------------------------
    End Parameters
    
  3. これらの設定が表の生成に含まれていないことを確認するには、liquibase update-sqlコマンドを使用します。このコマンドは、実行前にupdateコマンドによって実行される正確なSQLおよびPL/SQLコードを表示します。
    liquibase update-sql -changelog-file partition_compression_tablespace_test_table.xml

    パーティション化、圧縮および表領域の設定がオフの場合、SQLコードは次のスニペットのようになります。

    -- Changeset partition_compression_tablespace_test_table.xml::fb1d77405bcd3cf7d60e555337b80ec9555134d7::(HR)-Generated
    CREATE TABLE "PARTITION_COMPRESSION_TABLESPACE_TEST"
       (    "A" VARCHAR2(20) NOT NULL ENABLE,
            "B" VARCHAR2(20),
            "C" VARCHAR2(20) NOT NULL ENABLE,
            CONSTRAINT "PARTITION_COMPRESSION_TABLESPACE_TEST_PK" PRIMARY KEY ("A")
      USING INDEX ENABLE
       );
    

    パーティション化、圧縮および表領域の設定がオンの場合のSQLコードの例を次に示します。

    -- Changeset partition_compression_tablespace_test_table.xml::fb1d77405bcd3cf7d60e555337b80ec9555134d7::(HR)-Generated
    CREATE TABLE "PARTITION_COMPRESSION_TABLESPACE_TEST"
       (    "A" VARCHAR2(20) NOT NULL ENABLE,
            "B" VARCHAR2(20),
            "C" VARCHAR2(20) NOT NULL ENABLE,
            CONSTRAINT "PARTITION_COMPRESSION_TABLESPACE_TEST_PK" PRIMARY KEY ("A")
      USING INDEX
      PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING
      TABLESPACE "USERS"  ENABLE
       ) PCTFREE 0 PCTUSED 40 INITRANS 1 COMPRESS BASIC
      STORAGE(
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "USERS"
      PARTITION BY HASH ("C")
    (PARTITION "SYS_P803"  SEGMENT CREATION DEFERRED
      COMPRESS BASIC
      TABLESPACE "USERS");
    
  4. ターゲット環境でupdateコマンドを実行することにより、更新を適用して表を作成できます。これにより、パーティション化されていない非圧縮の表として作成され、(変更ログの生成元の環境の表領域を使用しようとするのではなく)ターゲット環境の表領域が使用されます。
    liquibase update -changelog-file partition_compression_tablespace_test_table.xml

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|-lbsn

    SQLclの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のdatabasechangelogdatabasechangeloglockおよび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;