スキーマ初期化
- 処理概要
- 全てのテーブルにtruncate実行
- 全てのFK制約をdrop
- 全てのテーブルをdrop
- 全てのシーケンスをdrop
- 全てのプロシージャをdrop
- 全てのDBリンクをdrop
- 全てのTYPEオブジェクトをdrop
- 別スキーマのテーブル削除
- スキーマ初期化前のSQL
処理概要
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するように変更可能です。
オプションでこの処理を抑制することは可能です(但し、基本的に非推奨)。
全てのDBリンクをdrop
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 する必要があります。