[Oracle]接続しているDBユーザのOSプロセスIDを取得

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
よかったらシェアしてね!
  • URLをコピーしました!
目次