Uploaded image for project: 'DBFlute'
  1. DBFlute
  2. DBFLUTE-604

{Java/C#}: ReplaceSchemaで一部SQLを他のユーザで実行できるように

XMLWordPrintable

    • Type: Icon: Improvement Improvement
    • Resolution: Fixed
    • Priority: Icon: Major Major
    • Component/s: None
    • None

      [Overview]
      最終的には、dbflute-oracle-exampleのDB環境構築を全てReplaceSchemaでできるようにしたい。
      DBをインストールしたら、SQLツールを一度も立ち上げること無くReplaceSchemaのみで構築完了としたい。
      それには以下のことを考慮する必要がある:

      o 設定ファイルでの他のユーザの接続情報の指定
      o 最初の一度だけ実行するオプション(主にSystemユーザの場合に)
      o environementType次第で実行のON/OFFができるように

      トランザクションは完全に別になるのは仕様。
      (但し、そもそもReplaceSchemaはオートコミットの状態で
      じゃんじゃん実行していくのがデフォルトなので基本意識する必要なし)

      CreateSchemaのSQL(replace-schema...sql)のみ対象。
      TakeFinallyのSQLではサポートしない(必要がないと思われるため)。

      [Specification]

      additionalUserMap = map:{
          ; [userDefName] = map:{
              ; url = [URL] (省略可: 省略時はメインのものと同じ)
              ; user = [USER]
              ; password = [PASSWORD]
          }
          ; system = map:{
              ; user = system
              ; password = system
          }
      }
      
      -- #df:changeUser(system)#
      -- #df:checkUser()#
      create user exampledb ...;
      grant ...;
      grant ...;
      grant ...;
      
      -- #df:reviveUser()#
      -- #df:checkUser()#
      grant ...;
      grant ...;
      grant ...;
      
      -- #df:backToMainUser()#
      create table ...
      

      <userDefName>
      userDefNameと実際のユーザやスキーマと関連は付けないようにする。
      environmentTypeによってユーザやスキーマ名が変わってくるかもしれないので。

      <changeUser(xxx)>
      指定されたユーザで実行するようになる。
      「再度changeUser()が呼ばれる」、「backToMainUser()が呼ばれる」、
      「該当のSQLファイルが終了する」のいずれかになるまでそのユーザで実行し続ける。
      そもそも該当User定義が存在しない場合は、それ以降そのユーザのSQLは実行されない(凍結)。
      そのときの例外もFailure扱いとしない。

      <checkUser()>
      SQLが例外になったら、指定されたユーザのそれ以降の実行はしない(凍結)。
      そのときの例外もFailure扱いとしない。
      (例えば、create userが例外になったらその後のSQLも実行しない)

      <reviveUser()>
      一度checkUser()でそのユーザが凍結されても、
      凍結を解除してそのユーザでSQLを実行する。
      「これだけは必ず実行したい」というSQLがある場合に有効。
      (例えば、別スキーマのオブジェクトに対する権限付与など)

      <backToMainUser()>
      メインユーザでの実行に戻る
      (SQLファイルが変われば自然と呼び出されるので、あまり利用しないかも)

      [Implementation]
      指定されたユーザのConnectionを作成し、そのConnectionを使って実行する。
      最後にConnectionは必ずCloseすること!
      また、接続の細かい設定はメインのものを引き継ぐ。

      [Supplement]
      Systemユーザじゃないnextexampledbのようなユーザでも利用可能だが、
      データ登録やDropに関しても同じような拡張をしない限り実用的でない。
      実際にはnextexampledbに関しては、それ専用のDBFluteクライアントを作るのがよい。
      もちろん、それでもこの機能は有効である(SYSTEMユーザでの実行ができるという点で)。

            Assignee:
            jflute jflute
            Reporter:
            jflute jflute
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: