私が取り組んでいるプロジェクトでは、行レベルのセキュリティを備えた Oracle データベースを使用しています。call DBMS_APPLICATION_INFO.SET_CLIENT_INFO('userId');
他の SQL ステートメントを実行する前に、呼び出すことができる必要があります。これを MyBatis 内に実装する方法を見つけようとしています。私が持っていたがうまくいかなかったいくつかのアイデアには、次のものがあります。
試行 1
<select id="selectIds" parameterType="string" resultType="Integer">
call DBMS_APPLICATION_INFO.SET_CLIENT_INFO(#{userId});
select id from FOO
</select>
ただし、1 回の JDBC 呼び出しで 2 つのステートメントを使用することはできません。また、MyBatis は JDBC バッチ ステートメントをサポートしていないか、少なくとも私が見つけたものはサポートしていません。
試行 2
<select id="selectMessageIds" parameterType="string" resultType="Integer">
<![CDATA[
declare
type ID_TYP is table of AGL_ID.ID_ID%type;
ALL_IDS ID_TYP;
begin
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(#{userId});
select ID bulk collect
into ALL_IDS
from FOO
end;
]]>
</select>
ただし、プロシージャでデータを返すことはできず、関数でのみデータを返すことができないため、データを返す方法がないことを知ったので、それは私が得た限りです。
試行 3
クライアント情報を設定する単純な MyBatis ステートメントを作成することだけを検討しました。これは、ステートメントを実行する前に呼び出す必要があります。これは最も有望に思えますが、Spring とデータベース接続プーリングを使用しているため、競合状態が心配です。接続が閉じられず、再利用されるため、クライアント情報が流出して他のステートメントに影響を与えないようにしたいと考えています。
ソフトウェア/フレームワークのバージョン情報
Oracle 10g
MyBatis 3.0.5
春 3.0.5
更新
MyBatis Spring 1.0.1 も使用していることを忘れていました