連載
» 2005年12月02日 00時00分 公開

これがODT+VS.NETの開発スタイルだ.NETでOracleアプリを作ろう(2)(3/4 ページ)

[小海友和,日本オラクル]

ポリシー・ファンクションの作成

使用するODTの機能

  • Oracleエクスプローラ
  • ファンクション・デザイナ
  • PL/SQLコード・エディタ

 ポリシー・ファンクションとは、アクセス制御のポリシーを実現するファンクションです。例えば、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つの引数を持つ必要があります。

メモ:今回、これらの引数は使用しませんが、ポリシーを実現するファンクションとしては2つの引数がないと動作しませんので、ダミーとして引数を用意します。

 このことを踏まえて、PL/SQLコード・エディタを使用して、ファンクションを作成します。

1. 新規PL/SQLファンクションの作成

 Oracleエクスプローラ上のファンクションを右クリックして「新規PL/SQLファンクション」をクリックします。PL/SQLファンクションの枠組みを作成するファンクション・デザイナが起動します(図11)。

図11 新規PL/SQLファンクションの作成 図11 新規PL/SQLファンクションの作成

2. ファンクション・デザイナでの設定

 ファンクション・デザイナ上で、ファクション名や引数の設定を行います。今回は、ファンクション名は「EMP_VPD_POLICY_FUNC」とします。また、「追加」ボタンをクリックし、引数を2つ用意します。引数の名前は何でも構いませんので、デフォルトのまま「PARAM1,PARAM2」などを使用します。方向はIN、データ型としてはVARCHAR2を指定します。設定が終わったら「OK」ボタンをクリックします(図12)。

図12 ファンクション・デザイナでの設定 図12 ファンクション・デザイナでの設定

3. ファンクション本体の作成

 ファンクション・デザイナでの設定が終了すると、PL/SQLコード・エディタが起動しますので、ここでアクセス制御のロジックを作成します。ファンクション・デザイナで作成されたファンクションのひな型には、コメントアウトされた説明やファンクションの必須要素であるRETURNの記述があります。

 PL/SQLの予約語は青、コメントアウトは緑というようにカラーリングされます。またPL/SQLコード・エディタにはインテリセンス(自動補完)機能もあり、データベース上のオブジェクトについては候補が表示されます。

図13 PL/SQLコード・エディタ 図13 PL/SQLコード・エディタ

 コメントアウト部分は削除して構いませんので、リスト1のようにアクセス制御のロジックを記述します。

  v_predicate  VARCHAR2(30);
BEGIN
  v_predicate := 
    CASE SYS_CONTEXT('USERENV','CLIENT_IDENTIFIER')
      WHEN 'D10' THEN 'deptno=10'
      WHEN 'D20' THEN 'deptno=20'
      WHEN 'D30' THEN 'deptno=30'
      WHEN 'D40' THEN 'deptno=40'
      ELSE '1=2'
    END;
  RETURN v_predicate;
END "EMP_VPD_POLICY_FUNC";
リスト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)。

図14 コードの保存(コンパイル) 図14 コードの保存(コンパイル)

 PL/SQLコードにエラーがある場合、タスク一覧にビルドエラーが表示され、ビルドエラーをダブルクリックすることで、問題のコードにジャンプすることが可能です(図15)。

図15 コンパイルエラーの表示 図15 コンパイルエラーの表示

 また、コンパイルが正常に終了していないファンクションについては、Oracleエクスプローラ上に赤く×印が表示されます(図16)。

図16 Oracleエクスプローラ上でのコンパイルエラーの表示 図16 Oracleエクスプローラ上でのコンパイルエラーの表示

次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。