[CONTAINER-427] [S2JDBC] SQL ファイルを使ったバッチ更新で,SQL ファイルに IF コメントや埋め込み変数コメントが使われているとエラーにする指定をできるようにしました. Created: 2010-09-02  Updated: 2010-09-03  Resolved: 2010-09-03

Status: Resolved
Project: S2Container
Component/s: S2JDBC
Affects Version/s: 2.4.42
Fix Version/s: 2.4.43

Type: Improvement Priority: Major
Reporter: saori murooka Assignee: koichik
Resolution: Fixed Votes: 0
Labels: None


 Description   

SqlFileBatchUpdateImplでは、最初に解析されたSQLをキャッシュしaddBatchする仕様だと思いますが、
SQLファイルに、条件によってWhere句や更新カラムを変更するようなIFコメントが含まれている場合、
意図しないSQLが実行されてしまうことがあります。

SQLのWhere句や更新カラムが変わってしまうようなOGNL式が含まれている場合は
Exception等throwしていただくことは可能でしょうか?

【例、UPDATE文で動的にSET句がかわる場合】

 
UPDATE
	TEST_TABLE
SET
	/*IF batchDD == '01'*/
	,CULUMNS01 = /*value*/1
	/*END*/
	/*IF batchDD == '02'*/
	,COLUMNS02 = /*value*/1
	/*END*/
WHERE
	DATE_YM = /*dateYm*/'201004'

最初にbatchDD=01だと、

 
UPDATE
	TEST_TABLE
SET
	CULUMNS01 = 1
WHERE
	DATE_YM = '201004'

というSQL文になります。

2行目が、仮にbatchDDが02でCULUMNS02にいれたいとしても、
キャッシュされたCULUMNS01をUPDATEするSQLが利用され値がCOLUMNS01に入ります。



 Comments   
Comment by koichik [ 2010-09-03 ]

対応しました.
http://www.seasar.org/source/browse/?view=rev&root=s2container&revision=4464

s2jdbc.dicon で JdbcManager の allowVariableSqlForBatchUpdate プロパティを false にすると,バッチ更新で IF コメントや埋め込み変数コメントを含む SQL ファイルが使われた場合に VariableSqlNotAllowedRuntimeException がスローされます.

Comment by koichik [ 2010-09-02 ]

バッチ更新では IF コメントや埋め込み変数コメントを使っていると例外をスローするオプションを付ける方向で検討するということで再オープン.

ちなみに S2Dao では SQL ファイルを使ったバッチ更新はサポートされていないとのことでした.心より恥じる.

Comment by koichik [ 2010-09-02 ]

> SQLのWhere句や更新カラムが変わってしまうようなOGNL式が含まれている場合は
> Exception等throwしていただくことは可能でしょうか?

バッチ更新であっても IF コメントや埋め込み変数コメントを使うケースは普通にありえるので,無条件にエラーとすることは出来ません.
問題なのは,その際に使われた OGNL 式が繰り返しの途中で変わることですが,それをチェックするには OGNL 式を繰り返し評価しなければいけないのでオーバーヘッドが大きくなります.
S2Dao 以来だと SQL ファイルは 6 年以上使われていますが,これで困ったという話は聞いたことがないので,実行時のオーバーヘッドを増やしてでも対処すべきとは判断できません.
よって,この件は対応しないことにさせてください.

このような SQL をバッチ更新で使ってしまうようであれば,原則としてバッチ更新を使わないようにして,その後で必要 (可能) な部分だけバッチ更新に変更するなどの方法で対処してください.

Comment by saori murooka [ 2010-09-02 ]

> SQLのWhere句や更新カラムが変わってしまうようなOGNL式が含まれている場合は
> Exception等throwしていただくことは可能でしょうか?

Exceptionをthrowしなくても、実行できなくなる等
ユーザーが気づく方法であれば結構です。

Generated at Fri Apr 26 02:22:22 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.