ポリシー・ファンクションとは、アクセス制御のポリシーを実現するファンクションです。例えば、ClientIdがD10であれば、deptnoが10のものを表示し、D20の場合はdeptnoが20のものを表示する、という制御をPL/SQLのファンクションで実装します。
.NETアプリケーションでClientIdとして設定された値は、データベース上ではUSERENV名前空間のCLIENT_IDENTIFIER事前定義パラメータとして格納されます。これから作成するファンクションはこのCLIENT_IDENTIFIERの値によって条件分岐し、ポリシーが設定される表にアクセスがあった場合に内部的に追加されるWHERE句の記述をRETURN値として返すものになります。
データベース上のCLIENT_IDENTIFIER値を取り出すには、SYS_CONTEXT関数を使用します。例えば、現在接続しているセッションのCLIENT_IDENTIFIER値を確認するSQL文は以下のようになります。
SELECT
SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') FROM dual; |
また、VPDのポリシー・ファンクションは2つの引数を持つ必要があります。
このことを踏まえて、PL/SQLコード・エディタを使用して、ファンクションを作成します。
Oracleエクスプローラ上のファンクションを右クリックして「新規PL/SQLファンクション」をクリックします。PL/SQLファンクションの枠組みを作成するファンクション・デザイナが起動します(図11)。
ファンクション・デザイナ上で、ファクション名や引数の設定を行います。今回は、ファンクション名は「EMP_VPD_POLICY_FUNC」とします。また、「追加」ボタンをクリックし、引数を2つ用意します。引数の名前は何でも構いませんので、デフォルトのまま「PARAM1,PARAM2」などを使用します。方向はIN、データ型としてはVARCHAR2を指定します。設定が終わったら「OK」ボタンをクリックします(図12)。
ファンクション・デザイナでの設定が終了すると、PL/SQLコード・エディタが起動しますので、ここでアクセス制御のロジックを作成します。ファンクション・デザイナで作成されたファンクションのひな型には、コメントアウトされた説明やファンクションの必須要素であるRETURNの記述があります。
PL/SQLの予約語は青、コメントアウトは緑というようにカラーリングされます。またPL/SQLコード・エディタにはインテリセンス(自動補完)機能もあり、データベース上のオブジェクトについては候補が表示されます。
コメントアウト部分は削除して構いませんので、リスト1のようにアクセス制御のロジックを記述します。
v_predicate VARCHAR2(30); |
リスト1 ポリシー・ファンクション |
SYS_CONTEXT関数を使用して、USERENVのCLIENT_IDENTIFIERの値を取得し、CASE式で条件分岐をしています。CLIENT_IDENTIFIERの値がD10の場合、このファンクションは返り値として「deptno=10」を返します。それを受けてデータベース内部ではWHERE句に「deptno=10」を追加します。
同様に、D20ならば「deptno=20」、すべての条件に該当しない場合は、必ずFalseとなる「1=2」を返すファンクションです。
PL/SQLのコードが書き終わったら、PL/SQLコード・エディタ上部のタブを右クリックし、保存をクリックします。Ctrl+Sで保存することも可能です。これにより、コードがコンパイルされデータベースに格納されます(図14)。
PL/SQLコードにエラーがある場合、タスク一覧にビルドエラーが表示され、ビルドエラーをダブルクリックすることで、問題のコードにジャンプすることが可能です(図15)。
また、コンパイルが正常に終了していないファンクションについては、Oracleエクスプローラ上に赤く×印が表示されます(図16)。
(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.