• Type: Improvement
    • Resolution: Fixed
    • Priority: Major
    • 2.4.43
    • Affects Version/s: 2.4.42
    • Component/s: S2JDBC
    • None

      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に入ります。

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

          koichik added a comment -

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

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

          koichik added a comment - 対応しました. http://www.seasar.org/source/browse/?view=rev&root=s2container&revision=4464 s2jdbc.dicon で JdbcManager の allowVariableSqlForBatchUpdate プロパティを false にすると,バッチ更新で IF コメントや埋め込み変数コメントを含む SQL ファイルが使われた場合に VariableSqlNotAllowedRuntimeException がスローされます.

          koichik added a comment -

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

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

          koichik added a comment - バッチ更新では IF コメントや埋め込み変数コメントを使っていると例外をスローするオプションを付ける方向で検討するということで再オープン. ちなみに S2Dao では SQL ファイルを使ったバッチ更新はサポートされていないとのことでした.心より恥じる.

          koichik added a comment -

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

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

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

          koichik added a comment - > SQLのWhere句や更新カラムが変わってしまうようなOGNL式が含まれている場合は > Exception等throwしていただくことは可能でしょうか? バッチ更新であっても IF コメントや埋め込み変数コメントを使うケースは普通にありえるので,無条件にエラーとすることは出来ません. 問題なのは,その際に使われた OGNL 式が繰り返しの途中で変わることですが,それをチェックするには OGNL 式を繰り返し評価しなければいけないのでオーバーヘッドが大きくなります. S2Dao 以来だと SQL ファイルは 6 年以上使われていますが,これで困ったという話は聞いたことがないので,実行時のオーバーヘッドを増やしてでも対処すべきとは判断できません. よって,この件は対応しないことにさせてください. このような SQL をバッチ更新で使ってしまうようであれば,原則としてバッチ更新を使わないようにして,その後で必要 (可能) な部分だけバッチ更新に変更するなどの方法で対処してください.

          saori murooka added a comment -

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

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

          saori murooka added a comment - > SQLのWhere句や更新カラムが変わってしまうようなOGNL式が含まれている場合は > Exception等throwしていただくことは可能でしょうか? Exceptionをthrowしなくても、実行できなくなる等 ユーザーが気づく方法であれば結構です。

            Assignee:
            koichik
            Reporter:
            saori murooka
            Votes:
            0 Vote for this issue
            Watchers:
            Start watching this issue

              Created:
              Updated:
              Resolved: