[seasar-dotnet:1197] Re: [DBFlute] 予約語とテーブル名の重複について

kubo [E-MAIL ADDRESS DELETED]
2008年 12月 2日 (火) 12:20:13 JST


久保(jflute)です。

> https://www.seasar.org/issues/browse/DBFLUTE-393

http://dbflute.sandbox.seasar.org/download/dbflute/patch/dbflute-0.8.7-393.jar
にてJDBCタスクでは落ちないような修正を入れてみました。
パッチ扱いで、問題なければ同じ修正が次バージョンに反映されます。
こちらで試せてないので、お手数ですが試していただけるとありがたいです。
ダウンロードしたjarファイルを、
「mydbflute/dbflute-0.8.7/lib/forExecute/dbflute.jar」と
差し替えてください。

> additionalPrimaryKeyとadditionalForeignKeyという手段がありましたか。

[additionalPrimaryKeyMap]
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example/dbflute_exampledb/dfprop/additionalPrimaryKeyMap.dfprop

[additionalForeignKeyMap]
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-basic-example/dbflute_exampledb/dfprop/additionalForeignKeyMap.dfprop

が参考になると思います。
実際にExampleではSUMMARY_PRODUCTというViewに対して、
PKとFKを付与しています。

2008/12/2 takai <[E-MAIL ADDRESS DELETED]>:
> 久保様
> 高井です。
>
> 早速回答ありがとうございます。
> 菊池様も回答ありがとうございます。
>
> SQLServer は [ ] で囲むのが正しいとは知りませんでした。
> 確かに DB によってエスケープの仕方が違うのは難点ですね…。
>
>
>> > テーブル名がデータベースの予約語
>> User テーブルを無視リストに加えて、
>> 新たに気の利いた名前のViewを作ることをお奨めします。
>> additionalPrimaryKeyとadditionalForeignKeyを設定することで、
>> CRUD全て可能になりますし、関連も元の「User」テーブルと
>> 全く同じように振る舞うことが可能です。
>
> additionalPrimaryKeyとadditionalForeignKeyという手段がありましたか。
> この方法で行こうと思います。
>
>
>> > ダブルコーテーションを付加するなどの回避策はないでしょうか?
>> > Dbm 名前空間のソースをいじっても変更されなかったようなのでどのあたりを
>> > いじればいいか教えていただけると幸いです。
>> 基本的には、ConditionBean.getTableSqlName()がCBで発行するSQLの
>> テーブル名の基盤となります。ただ、本当にそこが完全に全ての基に
>> なっているかどうかは確認は別途必要です。
>> (JavaだとEclipseで参照をすぐに調べられましたが、
>> C#はちょっと今手元に環境がないもので。。。)
>
> あ、そこだったんですか。
> 明日にでも少し探ってみようかと思います。
>
>
>> 【DBFluteの予約語対応について】
>> 予約語対応をDBFluteがするかどうかはそもそも決定していません。
>> 下手に対応していることで逆に予約語でDBを作られてしまうことが
>> あるのを懸念しているのと「除外テーブル(*1) + View + additionalXxxKey」
>> で回避ができることが理由となります。(単純にリソースの問題も...)
>> しかも、そのViewを作ることによって、外だしSQLも楽になるし、
>> DBFluteだけでなく他のツール(SQL*Plusとか)でSQL発行するときも
>> 扱いが楽になりますので、仮にDBFluteが予約語対応していたとしても
>> Viewを作る方が断然お奨めです。
>> (そう考えると予約語対応の対費用効果が薄いのです)
>
> 確かに費用対効果が薄いですね。
> そもそも予約語と同じ名前のテーブルを作ること自体あまり良くない気がする。
>
>
>> それでも、JDBCタスクで落ちちゃうのは課題とさせて頂きますね。
>> 少なくとも自動生成までできるようになっていれば、そのテーブルだけは
>> 全て外だしSQLっていう選択肢もできるようになるので。
>> https://www.seasar.org/issues/browse/DBFLUTE-393
>
> 自動生成だけでもできるとありがたいです。
> 最初落ちたとき少し悩んでしまいました。
>
>
>> 久保(jflute)です。
>>
>> 高井さん、こんばんは
>>
>> > テーブル名がデータベースの予約語
>> User テーブルを無視リストに加えて、
>> 新たに気の利いた名前のViewを作ることをお奨めします。
>> additionalPrimaryKeyとadditionalForeignKeyを設定することで、
>> CRUD全て可能になりますし、関連も元の「User」テーブルと
>> 全く同じように振る舞うことが可能です。
>>
>> > ダブルコーテーションを付加するなどの回避策はないでしょうか?
>> > Dbm 名前空間のソースをいじっても変更されなかったようなのでどのあたりを
>> > いじればいいか教えていただけると幸いです。
>> 基本的には、ConditionBean.getTableSqlName()がCBで発行するSQLの
>> テーブル名の基盤となります。ただ、本当にそこが完全に全ての基に
>> なっているかどうかは確認は別途必要です。
>> (JavaだとEclipseで参照をすぐに調べられましたが、
>> C#はちょっと今手元に環境がないもので。。。)
>>
>> また、菊池さんのアドバイス通り、
>> SQLServerではダブルコーテーションではなく「[]」となります。
>> (これまたDBによって違うのが結構悩みの種。。。)
>>
>> ※菊池さんフォローありがとうございます!
>>
>> 【DBFluteの予約語対応について】
>> 予約語対応をDBFluteがするかどうかはそもそも決定していません。
>> 下手に対応していることで逆に予約語でDBを作られてしまうことが
>> あるのを懸念しているのと「除外テーブル(*1) + View + additionalXxxKey」
>> で回避ができることが理由となります。(単純にリソースの問題も...)
>> しかも、そのViewを作ることによって、外だしSQLも楽になるし、
>> DBFluteだけでなく他のツール(SQL*Plusとか)でSQL発行するときも
>> 扱いが楽になりますので、仮にDBFluteが予約語対応していたとしても
>> Viewを作る方が断然お奨めです。
>> (そう考えると予約語対応の対費用効果が薄いのです)
>>
>> *1: http://d.hatena.ne.jp/jflute/20081014/1223976741
>>
>>
>> それでも、JDBCタスクで落ちちゃうのは課題とさせて頂きますね。
>> 少なくとも自動生成までできるようになっていれば、そのテーブルだけは
>> 全て外だしSQLっていう選択肢もできるようになるので。
>> https://www.seasar.org/issues/browse/DBFLUTE-393
>>
>> 2008/12/1 菊池和彦 <[E-MAIL ADDRESS DELETED]>:
>> > 菊池です
>> >
>> > SQL Server の場合、テーブル名やカラム名で予約語が含まれる可能性がある場合、
>> > [ ] で名前を括る事で表現できますね。
>> >
>> > select ... from [User]
>> >
>> > Userという名前のテーブルからselect
>> >
>> > update [User] set [passwd]='xxxx' where [USERID]=xx;
>> >
>> > カラム名やテーブル名に . (ドット)を含む場合にも[]によるクォートが必要になります。
>> >
>> > DBFluteでどうやるかは…悩ましいですね。
>> >
>> >
>> > 2008/12/01 20:12 高井朋幸 <[E-MAIL ADDRESS DELETED]>:
>> >> 久保様
>> >> 高井です。
>> >>
>> >> DBFlute 0.8.7 リリースお疲れ様です、というところすみませんが
>> >> 予約語とテーブル名が重なった場合の対処についてアドバイスいただ
>> >> ければと思います。
>> >>
>> >> SQLServer2005 で「User」のようにテーブル名がデータベースの予約語
>> >> とかぶっていると jdbc.bat や SQL 発行で以下のようにエラーが発生
>> >> してしまいます。
>> >>
>> >> -------------------------
>> >> SQLException: primaryKeyColumnName=USER_ID tableMetaInfo=dbo.USER(TABLE): nu
>> >> ll ignoredMessage=キーワード 'User' 付近に不適切な構文があります。
>> >> -------------------------
>> >>
>> >> とりあえず User テーブルを無視リストに加えて JDBC.bat 実行後に User
>> >> テーブル用の schema.xml を書き加えて強引に generate.bat で
>> >> C# のクラスを作って対処しました (table name="User" として)。
>> >> それを利用すると発行される SQL でやはり同じように SQLException
>> >> が発生してしまいます。
>> >>
>> >> C# のクラスは作成できているので、
>> >> ベタなコーディングでもよいのですが、発行される SQL のテーブル名に
>> >> ダブルコーテーションを付加するなどの回避策はないでしょうか?
>> >> Dbm 名前空間のソースをいじっても変更されなかったようなのでどのあたりを
>> >> いじればいいか教えていただけると幸いです。
>> >>
>> >> 本当は根本原因を解決したいところなのですが…。
>> >> 既存のシステムで利用されている DB なのでテーブル名を変更する
>> >> ことができなくて頭が痛いところです。
>> >> しかも、CRUD すべて対象だし・・・
>> >>
>> >> よろしくお願いいたします。
>> >>
>> >> _______________________________________________
>> >> seasar-dotnet mailing list
>> >> [E-MAIL ADDRESS DELETED]
>> >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >>
>> >
>> >
>> >
>> > --
>> >  Kazuhiko Kikuchi <[E-MAIL ADDRESS DELETED]>
>> >  Microsoft Valueable Professional - Visual C# 2004-2007
>> > _______________________________________________
>> > seasar-dotnet mailing list
>> > [E-MAIL ADDRESS DELETED]
>> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>> >
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> --
> Takai ICT 株式会社
> 高井朋幸 <[E-MAIL ADDRESS DELETED]>
> TEL: 090-6192-6789
> http://www.takaiict.com/
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内