Database OracleDB インフラ

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

2017年10月5日

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

 

関連記事

-Database, OracleDB, インフラ

Copyright© shimidai2100 , 2020 All Rights Reserved.