OracleDBでセッション情報を扱った操作はSYS_CONTEXTを使いこなす必要がある。
SYS_CONTEXTの使い方あれこれを書いていこう思います。
SYS_CONTEXTって何?
マニュアルには
SYS_CONTEXT
は、現在のコンテキストnamespace
に関連付けられたparameter
の値を戻します。このファンクションは、SQL文およびPL/SQL文で使用できます。SYS_CONTEXT
はローカルに実行する必要があります。
とかいてあります。 ?ってなりますよね笑
まずコンテキストnemespaceとはなに?
簡単に説明すると表とは違うデータの持ち方です(正確には違うが) データをコンテキスト、文脈として扱います。
「ごはんを食べる。」というように、「ごはん」に続くワードは「食べる」だったり「炊く」だったり決まってますよね?
「〇〇と△△する。」という文脈の考え方をOracleDBでも利用できます。
これがOracleDB上でのコンテキストです。
で、SYS_CONTEXTってなに?
SYS_CONTEXTとはこのコンテキストNamespaceを利用することができるファンクションです。
OracleDBではSYS_CONTEXTを使用しないとコンテキストNamespaceを利用できません。
SYS_CONTEXTを使用する
SYS_CONTEXTを使用しましょう。
OracleDBでSYS_CONTEXTを使用すると言ったら基本的に 事前定義済のコンテキストを指します。ではでは紹介します。
USERENV
この記事のメイン!!**セッション情報を取得する方法です!!!**
接続元IPアドレスを取得
↓が利用方法です。
select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
実際の実行ログは↓です。
TEST001@orcl > select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
SYS_CONTEXT('USERENV','IP_ADDRESS')
--------------------------------------------------------------------------------
192.168.56.115
こんな感じで接続元IPが取得できます。
接続元プログラム名を取得
↓が利用方法です。
select SYS_CONTEXT('USERENV','MODULE') from dual;
実際の実行ログは↓です。
TEST001@orcl > select SYS_CONTEXT('USERENV','MODULE') from dual;
SYS_CONTEXT('USERENV','MODULE')
--------------------------------------------------------------------------------
SQL*Plus
こんな感じでプログラム名が取得できます。
その他の取得
↓のマニュアルを確認しよう。 https://docs.oracle.com/cd/E16338_01/server.112/b56299/functions184.htm
SYS_SESSION_ROLES
接続しているユーザに該当するロールが付与されているか確認。
select SYS_CONTEXT('SYS_SESSION_ROLES', 'ROLE_NAME') from dual ;
実際の実行ログは↓です。
TEST001@orcl > select SYS_CONTEXT('SYS_SESSION_ROLES', 'DBA') from dual;
SYS_CONTEXT('SYS_SESSION_ROLES','DBA')
--------------------------------------------------------------------------------
TRUE
TEST001@orcl >
TEST001@orcl >
TEST001@orcl > select SYS_CONTEXT('SYS_SESSION_ROLES', 'TEST_ROLE') from dual;
SYS_CONTEXT('SYS_SESSION_ROLES','TEST_ROLE')
--------------------------------------------------------------------------------
FALSE
TEST001@orcl >
”TRUE”ならば付与されており、”FALSE”ならば付与されていないです。
SYS_CONTEXTでできること
SYS_CONTEXTを利用すれば現在のセッション情報を取得できる。
これを利用してサンプルをつくってみました。
SYS_CONTEXTを使用してOSのプロセスIDを取得
SYS_CONTEXTだけでは直接OSのプロセスIDは取得できない。
↓にも書いてあるので確認くださいませ。