スキーマ初期化

処理概要

DBFluteプロパティ databaseInfoMap.dfprop に定義されたスキーマに接続し、スキーマのメタデータを元に対象となるオブジェクトをdropします。

基本的に drop対象となるオブジェクトは全て接続したスキーマ(メインスキーマ)のオブジェクト に限ります。AdditionalSchema の設定はここには影響しません。但し、オプションで別スキーマのオブジェクトをdrop することが可能です。

一つでも実行に失敗した場合(truncate処理を除く)は、ReplaceSchemaが中断されます。

これらの処理は全て "オートコミットモード" で実行されます。ただ、これら処理は基本的にDDL文なのでトランザクションの有無はそもそも無関係です。

全てのテーブルにtruncate実行

FK制約などでtruncateが失敗するテーブルは素通りします。 よって全てのテーブルがtruncateされるわけではなく、(比較的レコード量が多いと思われる)FK参照されないテーブルのみ対象となります。

これは、後の実行する drop table のパフォーマンスを向上させるために行っています。 例えば、100万件のレコードを保持するテーブルを何もせずdropしようとするとかなり時間を費やします。

オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。

全てのFK制約をdrop

全てのテーブルを正確にdropするために、事前にFK制約を全てdropします。

オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。

コラム1:FKのdropの功名

手動でDB再構築をしようとした場合、FKのdropが結構面倒なものです。 例えば、テーブル名が変わってしまった場合など、ERDツールなどから自動生成するdrop文に古いFK制約に関するdrop文が含まれておらず、 テーブルがdropできないで再構築が失敗してしまうなど、ちょっとしたギャップが手間を発生させてしまいますが、ReplaceSchemaではその手間は全くありません。

全てのテーブルをdrop

テーブルだけでなく、databaseInfoMap.dfprop の objectTypeTargetList に定義されているオブジェクトが対象となります。例えば、ビューやシノニムなども、このプロパティ次第ではdrop対象となります。

そのスキーマに定義されている全てのテーブルをdropします。例えば、自動生成対象外のテーブルもdropされます。 オプションで自動生成対象のテーブルのみをdropするように変更可能です。

オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。

全てのシーケンスをdrop

sequenceDefinitionMap.dfprop に定義されているシーケンスかどうかに関係なく、全てのシーケンスをdropします。

オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。

全てのプロシージャをdrop

outsideSqlDefinitionMap.dfprop でのSql2Entityでの自動生成対象とするか否かの設定に関係なく、全てのプロシージャをdropします。

そのスキーマに定義されている全てのプロシージャをdropします。例えば、自動生成対象外のプロシージャもdropされます。 オプションで自動生成対象のプロシージャのみをdropするように変更可能です。

OutsideSql - プロシージャの自動生成対象の指定

オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。

DBリンクをサポートしているDBMS、かつ、DBリンク情報が取得できるDBMSにおいて、DBリンクをdropします。

対象となっているDBMSは、Oracle です。

この挙動はDBリンクの作成もReplaceSchemaにおいて実行することを前提としていますが、 そうでない場合のために、オプションでこの挙動を無効にすることが可能です。

全てのTYPEオブジェクトをdrop

TYPEオブジェクトをサポートしているDBMS、かつ、TYPEオブジェクト情報が取得できるDBMSにおいて(Oracle)、TYPEオブジェクトをdropします(@since 0.9.7.6)。

対象となっているDBMSは、Oracle です。

この挙動はTYPEオブジェクトの作成もReplaceSchemaにおいて実行することを前提としています。 テーブルとプロシージャのdropが両方とも無効に設定されたときに、この挙動も一緒に無効になります。(単独での抑制はできません)

別スキーマのテーブル削除

オプションで、メインスキーマのテーブル削除前に、別スキーマのテーブルを削除することができます。

例えば、FK制約などで依存関係がある複数DB構成 のときに、もう片方のDBをdropしないとReplaceSchema処理を続行できないという場合に、その片方のDBを先にdrop するように設定しておきます(その後、その片方のDBに対するReplaceSchemaは別途実行すること)。

e.g. 隣のスキーマのテーブルを削除 @replace-schema-xxx.sql
; additionalDropMapList = list:{
    ; map:{
        ; url = jdbc:oracle:thin:...
        ; schema = NEXTEXAMPLEDB
        ; user = nextexampledb
        ; password = nextexampledb
        ; propertiesMap = map:{}
        ; objectTypeTargetList = list:{TABLE;VIEW}
        ; tableExceptList = list:{}
        ; tableTargetList = list:{}
        ; isDropAllTable = false
    }
}

スキーマ初期化前のSQL

スキーマ初期化前に独自のSQLを実行することができます。

DBMSの特性上、どうしてもスキーマ初期化前に独自のSQLを実行する必要があるような場合に有効です。 例えば、PostgreSQLにおいて pg_trgm などの extension を利用する場合に、スキーマ初期化前に extension を事前に drop する必要があります。