schemaSyncCheckでエラー

99 views
Skip to first unread message

awaawa

unread,
Jul 26, 2012, 1:20:09 PM7/26/12
to DBFluteユーザの集い
jfluteさん

awaawaです。

schemaSyncCheckについて、質問です。
以下の設定で、docタスクを実行するとエラーが出てしまいます。
・databaseInfoMap.dfpropのadditionalSchemaMapを指定
・documentDefinitionMap.dfpropのschemaSyncCheckMapを指定
※additionalSchemaMapをコメントアウトして、docタスクを実行すると、エラーが出ません。

エラー内容
[df-doc] The same-name table between different schema is
unsupported!
[df-doc]
[df-doc] [Advice]
[df-doc] Use view or synonym (or alias) that refers to the table.
[df-doc]
[df-doc] [Duplicate Table]
...

書いていて、ふと思ったのですが、
additionalSchemaMapで2つのスキーマを設定しているのですが、
その2つのスキーマに同じテーブル名がいくつかあったような気がします。
もしかしてそれが原因でしょうか。
(自動生成の際は、tableTargetListを指定しているため問題ない?)

あと、schemaSyncCheckでストアドプロシージャの比較(差異の有無)が出来るようにしていただけないでしょうか。
(結果的にhistoryHtmlでも比較が出来ると。)
oracleだとALL_SOURCEでソースを取得できるので。
ご検討よろしくお願いします。

kubo

unread,
Jul 27, 2012, 4:36:49 AM7/27/12
to dbf...@googlegroups.com
jfluteです。

awaawaさん、こんにちは

SchemaSyncCheckの処理でAdditionalSchemaが紛れちゃってる
のかもですね。SchemaSyncCheckのときはメインスキーマの
オブジェクトだけを対象にするようにしてみます。
(ちょっとまだソース見切れてないので、これからだけど)

> あと、schemaSyncCheckでストアドプロシージャの比較(差異の有無)が出来るようにしていただけないでしょうか。
おお、これはいいね。ありがとう。
ただ、プロシージャのメタ情報の持ち方が悩ましいところですね。
SchemaXMLにプロシージャのメタ情報も持たせられるようにしないとかな...
もしくは、schemaSyncCheckのDocタスクのときだけ、その場でメタ情報を
抽出してメモリ内で保持してって感じかな。
少なくとも、プロシージャの追加、削除、引数の形だけでも出せればと。
8月どんだけ頑張れるか次第というところで。

2012/7/27 awaawa <p1us3i...@gmail.com>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>

kubo

unread,
Jul 27, 2012, 4:54:58 AM7/27/12
to dbf...@googlegroups.com
jfluteです。

awaawaさん、dbflute-0.9.9.7B-RC1で試してみてくれる?
(すぐに試せるかな?土日中希望)
ささっと直しただけで、ほんとにこれでいいのかちょと不安。
SchemaSyncCheckの処理では完全にAdditionalSchemaを
除外するようにしました。

2012/7/27 kubo <dbf...@gmail.com>:

awaawa

unread,
Jul 27, 2012, 7:05:25 AM7/27/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

対応ありがとうございます。確認しました。同じエラーになりました。

ソースを軽く追いましたが、
DfSchemaXmlSerializer
serialize→generateXML→getTableNames→assertDuplicateTable
でテーブルの重複チェックでエラーになっているようです。

> ストアドプロシージャの比較
以前、ストアドプロシージャの処理が環境で違って、トラブルになったことがあるので、ぜひ対応してもらえると。

> ただ、プロシージャのメタ情報の持ち方が悩ましいところですね。
確かにそうですね。
文字列のハッシュコードでと思ったのですが、文字数が多いとハッシュコードの計算時間も馬鹿にならないですね。。。

2012年7月27日 17:54 kubo <dbf...@gmail.com>:

kubo

unread,
Jul 27, 2012, 7:53:15 AM7/27/12
to dbf...@googlegroups.com
jfluteです。

> 対応ありがとうございます。確認しました。同じエラーになりました。
ごめん、もういっかい。ふつうにまちがえた。
RC1を上書きした。

takeshi awane

unread,
Jul 29, 2012, 11:08:50 PM7/29/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

すいません、確認遅くなりました。
問題なくschemaSyncCheck出来ました。ありがとうございます。

うまく動作したところで、3点要望があります。もし可能であれば、検討いただけますか。

・schemaSyncCheckをdocタスクと独立して実行できるように。
 →Manageタスクでjdbc+schemaSyncCheckタスクを実行するイメージです。(docのLoadDataReverseなどは実行しない。)

・schemaSyncCheckMapで複数の環境を設定できるようにして、schemaSyncCheckで複数環境を同時に実行できるように。
 →DBFLUTE_ENVIRONMENT_TYPEを使って、sync-check-result.diffmapをバッチでリネームすれば実現可能ですが、
  出来れば対応していただきたいです。

・isCheckColumnDefOrderDiffのオプションをhistoryHtml、schemaSyncCheckで別に設定できるように。
 →商用環境や準商用環境などでは、カラム追加はテーブルの最後の位置になるため。

2012年7月27日 20:53 kubo <dbf...@gmail.com>:

kubo

unread,
Jul 30, 2012, 1:57:09 AM7/30/12
to dbf...@googlegroups.com
jfluteです。

awaawaさん、確認ありがとう!
AdditionalSchemaばりばりの環境じゃないとわからないバグ
だったので助かりました。

> うまく動作したところで、3点要望があります。もし可能であれば、検討いただけますか。
うむ、わかる!という感じで、AlterCheckも似たような話があります。
もっと早く、manage.shを導入していればそうなっていたかもだけど、
その頃はバッチファイルを増やしたくなかったので、
何かのタスクのオプション的な要素になっちゃったんだよね。

本来なら、LoadDataReverseもSchemaSyncCheckもAlterCheckもそれぞれ
別のタスクにして、manage.shで独立して叩ければって感じですね。
申し訳ないけど、ちょっと全体設計に関わる部分なので、
おいそれとすぐにできる問題ではないので、時間はかかると思います。
ただ、要望としては、「やっぱそうだよね」ってのがわかったので、
今後の参考にしたいと。

2012/7/30 takeshi awane <p1us3i...@gmail.com>:

awaawa

unread,
Jul 30, 2012, 1:33:18 PM7/30/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

> おいそれとすぐにできる問題ではないので、時間はかかると思います。
> ただ、要望としては、「やっぱそうだよね」ってのがわかったので、
> 今後の参考にしたいと。
ストアドプロシージャの比較(差異の有無)も含め、ご検討よろしくお願いします。

schemaSyncCheck、対応ありがとうございました。

2012年7月30日 14:57 kubo <dbf...@gmail.com>:

kubo

unread,
Jul 30, 2012, 6:13:52 PM7/30/12
to dbf...@googlegroups.com
jfluteです。

まず、Docタスクで自動生成されるSchemaHTMLですが、
中に作成日時を持っていますが、これを廃止しました。
Doc叩くたびに日時だけ更新されてコミット対象になってしまうのが、
同じ構造であればDocを幾ら叩いても何も変わらないようにと。
(いつもRevertするのがめんどう)
以前は、作成日時があったら便利かなと思っていたのですが、
いまやHistoryHTMLもあるし、SVN管理でだいたいわかるしと、
ほとんど役に立った試しがないので判断しました。
(これで気軽にDocを叩いても大丈夫なようになりました)

そして、DocタスクのLoadDataReverseとSchemaSyncCheck、
ReplaceSchemaタスクのAlterCheckにSavePrevious、
これらをManageタスクから単独で実行できるようにしました。

sh manage.sh load-data-reverse
sh manage.sh schema-sync-check
sh manage.sh alter-check
sh manage.sh save-previous

内部的には色々と挫折の繰り返しでしたが、
DocタスクやReplaceSchemaタスクであることには変わりなく、
Manageから叩いた場合に、その他の処理が実行されないように
という感じに実装しました。プロパティ設定は変わってないですが、
Manageでよく使うタスクがある場合は、手動作成バッチを作ることが
想定されるので、その中でdfpropの切り替えをやってもらえればと。
(xxxMap+.dfpropであれば、差分でオーバーライドできるので)

また、ManageのAlterCheckですが、
alter直下に置かないでもAlterCheckできるようにしました。
具体的には、
「/alter/draft/alter-schema.sql」
というようにdraft配下に置いた状態だと、
ReplaceSchema --> いつものReplaceSchema(alter直下に何もないので)
Manage to AlterCheck --> draft配下のファイルalter直下に移動して実行
つまりは、AlterCheckをやっている最中でも、ReplaceSchemaは単独で
動作できるようになりました。いままでは、AlterCheckやってる最中は、
ReplaceSchemaがAlterCheckになってしまうので、alter配下からDDLを
どかさないといけませんでした。
(とはいっても、そんな長くAlterCheckをやり続けることもめったにないけど)

もう、24時間以内にはリリース予定の 0.9.9.7B に含まれます。
SNAPSHOTとして既にダウンロードもできます。


あと、Docタスク周りの話で、SchemaHTMLの区分値の欄に、
subItemMapとgroupingMapの情報を表示するようにしました。


プロシージャの差分は、内部的には一番インパクトがあるので、
9月の大舞台のスコープに入るかどうかこれから判断します。
(SchemaXMLにプロシージャの情報を格納してあげないと...)

2012/7/31 awaawa <p1us3i...@gmail.com>:

takeshi awane

unread,
Jul 31, 2012, 6:18:34 AM7/31/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

対応ありがとうございます。大変助かります!!!
(対応早ー)

> まず、Docタスクで自動生成されるSchemaHTMLですが、
> 中に作成日時を持っていますが、これを廃止しました。
確かに、自分も作成日時以外に変更ないとRevertしていました。

> Manageでよく使うタスクがある場合は、手動作成バッチを作ることが
> 想定されるので、その中でdfpropの切り替えをやってもらえればと。
早速、複数環境を一気にSchemaSyncCheckするバッチを作って確認しました。
意図通りの動きになりました。ありがとうございます。

HistoryHTMLとSchemaSyncCheck(とAlterCheck)の
チェック対象のオブジェクトについてですが、チェック対象は以下であっているでしょうか。
(○=対象、△=対象(ON/OFF可)、×=現在対象外)

○テーブル追加、削除(テーブル名変更は、削除、追加扱い)
○カラム追加、削除(カラム名変更は、削除、追加扱い)
○カラムのデータ型変更
○カラムサイズ変更
○カラムのデフォルト値変更
○制約追加、削除(not nullやPK、FK、UK)
○インデックス追加、削除
△カラムの定義順序
△テーブル、カラムのコメント
×制約名の変更
×ストアドプロシージャ(ファンクション、パッケージ)
×シーケンス(対象?)
×トリガー
×DBリンク
×マテビュー
×シノニム(対象?)

ご確認よろしくお願いします。

2012年7月31日 7:13 kubo <dbf...@gmail.com>:

awaawa

unread,
Jul 31, 2012, 1:36:51 PM7/31/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

> ただ、プロシージャのメタ情報の持ち方が悩ましいところですね。
> SchemaXMLにプロシージャのメタ情報も持たせられるようにしないとかな...
ちょっと考えてみました。
ソースコードをそのまま保持するのは厳しそうなので、
割り切りで、ソース行数、ソースサイズ、ソースコードのハッシュ値合計をSchemaXMLで保持して、
比較するのはどうでしょうか。(コード修正した場合に偶然一致する可能性はほぼないかと。)
※mysqlとPostgreSQLはinformation_schema.routinesで同じように取れるかと。

select
  OWNER,
  NAME,
  TYPE,
  max(LINE) AS MAX_LINE,
  sum(LENGTH(TEXT)) AS CODE_SIZE,
  sum(ORA_HASH(TEXT)) AS HASH
from ALL_SOURCE
group by OWNER, NAME, TYPE

2012年7月31日 19:18 takeshi awane <p1us3i...@gmail.com>:

kubo

unread,
Aug 1, 2012, 12:41:28 PM8/1/12
to dbf...@googlegroups.com
jfluteです。

まとめてくれてありがとう!
これいいね。ドキュメントに載せたいくらいだ。

> ×制約名の変更
> ×ストアドプロシージャ(ファンクション、パッケージ)
> ×シーケンス(対象?)
> ×トリガー
> ×DBリンク
> ×マテビュー
> ×シノニム(対象?)

シノニムは、間接的な感じですかね。
テーブルに対するシノニムで自動生成対象であれば、
テーブルとして差分に出てきます。まあでも x は x。
マテビューも、VIEWが自動生成対象なので、
項目が変われば差分になります。ただ、中のSQLの
条件が変わったとかはわからないですね。

この中で言えば、
「シーケンス」と「ストアドプロシージャ」
はやりたいですねぇ。

> ソースコードをそのまま保持するのは厳しそうなので、
> 割り切りで、ソース行数、ソースサイズ、ソースコードのハッシュ値合計をSchemaXMLで保持して、
> 比較するのはどうでしょうか。(コード修正した場合に偶然一致する可能性はほぼないかと。)
> ※mysqlとPostgreSQLはinformation_schema.routinesで同じように取れるかと。

うおうおうおぅ、ありがとう。
参考にさせて頂くね。

とりあえずプロシージャ名と引数の形が最低ラインかなという
ところですが、単に「なんか変わった」っていうのだけでも
検知できればってところでこれが使えますね。

2012/8/1 awaawa <p1us3i...@gmail.com>:

awaawa

unread,
Aug 2, 2012, 12:44:02 PM8/2/12
to dbf...@googlegroups.com
jfluteさん

awaawaです。

回答ありがとうございます。現在の対象が分かってスッキリしました。

> 単に「なんか変わった」っていうのだけでも
> 検知できればってところでこれが使えますね。
組み込んでいただけるとありがたいです。

気をつけていても、
環境ごとに差分が出たり、
DB変更の申請と結果で差分が出たりすることが時たまあるので、
HistoryHTML、SchemaSyncCheckはとても重宝しています。

2012年8月2日 1:41 kubo <dbf...@gmail.com>:

jflute

unread,
Sep 12, 2019, 1:10:35 AM9/12/19
to DBFluteユーザの集い
jfluteです

> また、ManageのAlterCheckですが、
> alter直下に置かないでもAlterCheckできるようにしました。
> 具体的には、
> 「/alter/draft/alter-schema.sql」
> というようにdraft配下に置いた状態だと、
> ReplaceSchema --> いつものReplaceSchema(alter直下に何もないので)
> Manage to AlterCheck --> draft配下のファイルalter直下に移動して実行
> つまりは、AlterCheckをやっている最中でも、ReplaceSchemaは単独で
> 動作できるようになりました。いままでは、AlterCheckやってる最中は、
> ReplaceSchemaがAlterCheckになってしまうので、alter配下からDDLを
> どかさないといけませんでした。
> (とはいっても、そんな長くAlterCheckをやり続けることもめったにないけど)

だいぶ前のスレッドですが、
上記のAlterCheckのdraft機能 DBFlute-1.2.1 より削除しようかと思っています。

作ってみたもののあまり有効活用されていません(恐らく)。
gitが活用されるようになってきてブランチの切り替えも簡単なので、
こういった機能自体DBFluteが持つ必要がなくなったと言えます。
ドキュメントにも書いてないので知っている人もいないでしょう。

そして、AlterCheckのリニューアルにおいて機能が残っていると
複雑になり過ぎるため、削除しようと思いました。



Reply all
Reply to author
Forward
0 new messages