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

kubo [E-MAIL ADDRESS DELETED]
2008年 12月 1日 (月) 23:51:01 JST


久保(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 メーリングリストの案内