Oracleにはアプリケーションコンテキストというものがあります。ASP.NETで言うところの「セッション」みたいなもので、基本はKey-Valueで構成される情報を保持しています。Oracleのマニュアルを見るとCREATE CONTEXT文というのがちゃんと用意されており、ユーザ定義のアプリケーションコンテキストを使用すればかなり柔軟なアプリケーションを作成することが可能です。
今回は御触りということで、ユーザ定義のアプリケーションコンテキストは使用せずに組込みのアプリケーションコンテキスト「USERENV」を少しだけ使用します。
アプリケーションコンテキスト「USERENV」
USERENVにはセッションに関する情報がほぼ詰め込まれています。今回はこの中の「CLIENT_IDENTIFIER」を使用します。理由は至って簡単-ODP.NETのOracleConnection.ClientIdからお手軽に設定できるからです。
その他の値については下記のOracleのドキュメントを参照してください。
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-02/functions.htm#11790
アプリケーションコンテキストの確認方法
アプリケーションコンテキスト確認用の関数があるので、それを使用します。
SYS_CONTEXT(namespace, parameter [, length ])
namespaceにUSERENV
parameterにCLIENT_IDENTIFIER
を指定します。lengthはオプショナルな設定値なので今回は無視(デフォルト値は256)
※USERENV関数というのもありますが下位互換用です。またUSERENV関数にはCLIENT_IDENTIFIERを取得する機能は存在しないので、基本SYS_CONTEXTを使用します。
ODP.NETでCLIENT_IDENTIFIERの設定
先に言ってしまいましたが、ODP.NETの以下のプロパティを設定します。
OracleConnection.ClientId
このプロパティは接続をOpenした後にのみ設定可能です。ClientIdは接続中つねに有効になり、Closeと共に解放されます(nullが設定される)。
|
using (OracleConnection conn = new OracleConnection("user id=XXXX; password=YYYY; data source=xe")) { conn.Open();
conn.ClientId = "30"; command = conn.CreateCommand(); command.CommandText = "SELECT SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') FROM DUAL"; result = command.ExecuteScalar(); Console.WriteLine(result.Equals(System.DBNull.Value) ? "null" : result.ToString()); } |
アプリケーションコンテキストを使用してVIEWへ値を動的に渡す
アプリケーションコンテキストは関数を通して取得できるということで、VIEWなどに対して動的に値を渡すことが可能です。VIEWであれば、使用しているSQL側でWHERE句に条件を設定することで同じことが当然できますが、セキュリティ的な要件をVIEWでコントロールしたい場合などに役立ちます。(Oracleではセキュリティに関して、仮想プライベートデータベースという便利な機能がありますが、今回はそれを使用しません。)
ためしに以下のようなVIEWをOracleのHRスキーマ上に作成します。
|
-- マネージャ直下の部下を参照できるVIEW CREATE OR REPLACE VIEW HR.EMPLOYEES_UNDER_MANAGER1 AS SELECT * FROM HR.EMPLOYEES WHERE MANAGER_ID = SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') |
このVIEWはClientIdに社員IDが設定されていることを前提に作られています。ClientIdの値を変えることで返却される行が変更されます。
次回はユーザ定義のアプリケーションコンテキストの作成方法について説明しようと思います。