OracleのDBユーザのセッション情報を表示するためにはSYS_CONTEXTを利用することが多い。
しかし、SYS_CONTEXT単体だと接続している”OSのプロセスID”を取得することができない。
目次
OSのプロセスIDの取得方法
OSプロセスを取得するSQL
簡単に説明するとv$sessionとv$processを結合します。
取得方法は↓です。
select p.SPID
from v$session s , v$process p
where s.paddr = p.addr
and s.SID = sys_context('USERENV','SID');
実行ログ
実行ログは↓です。
SQL> select SPID
2 from v$session s , v$process p
3 where s.paddr = p.addr
4 and s.SID = sys_context('USERENV','SID');
SPID
------------------------------------------------------------------------
9629★
SQL> !ps -ef | grep oracleorcl
oracle 9629★ 9628 0 09:32 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 9681 9628 0 09:32 pts/1 00:00:00 /bin/bash -c ps -ef | grep oracleorcl
oracle 9683 9681 0 09:32 pts/1 00:00:00 grep oracleorcl
SQL>
解説編
v$sessionの列”SID”とSYS_CONTEXT(’USERENV’, 'SID')
はイコールである。
接続したセッションの情報を取得したい場合は、
Where句でv$session.SID = SYS_CONTEXT(’USERENV’, 'SID')
としよう。
また基本的にv$sessionはv$XXXXXビューと結合することができます。
応用編
OSのプロセスIDをログオン時記録
↓がログオントリガーを利用した取得方法です。
create table sys.os_info(
SESSIONID NUMBER
, OS_PID VARCHAR2(24)
, EVENTTIME DATE
);
create or replace trigger sys.get_osinfo
after logon on database
declare
v_os_sid varchar2(24);
begin
select p.SPID into v_os_sid
from v$session s , v$process p
where s.paddr = p.addr
and s.SID = sys_context('USERENV','SID');
insert into
sys.os_info
values(
sys_context('USERENV','SESSIONID')
, v_os_sid
, SYSDATE);
commit;
end;
/
OSのプロセスID取得ログオントリガー
下のように出力されます。
10:03:29 SYS@orcl > select * from sys.os_info;
SESSIONID OS_PID EVENTTIME
---------- -------- -------------------
461748257 14480 2017-09-23 10:03:15
経過: 00:00:00.01
10:03:34 SYS@orcl > !ps -ef | grep oracleorcl
oracle 14480 14479 0 10:03 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 14543 14479 0 10:03 pts/1 00:00:00 /bin/bash -c ps -ef | grep oracleorcl
oracle 14545 14543 0 10:03 pts/1 00:00:00 grep oracleorcl