プロが教える店舗&オフィスのセキュリティ対策術

自作のストアドプロシージャのどの関数がいつ呼ばれたかを記録したいと思いました。
例えば FUNC_A という関数があって、その関数の先頭で、その関数を実行しているセッションのSIDと関数名を取得できないものでしょうか。

そのようなパッケージ DBMS_**** みたいなものがあって、下記のような感じで使えたらなあと考えています。
------------------
FUNC_A
IS
sid NUMBER;
funcName VARCHAR2(30);
BEGIN
SELECT DBMS_****.GET_EXECUTING_SID INTO sid FROM DUAL;
SELECT DBMS_****.GET_CURRENT_FUNC INTO funcName FROM DUAL;
...
(sid と funcName を現時刻とともに記録)
END;
------------------

このような目的に合致したパッケージ、あるいはこの目的を実現する方法などありますでしょうか。

よろしくお願いします

A 回答 (3件)

dda167さん



蛇足や余計なお世話などではありませんね。

質問者さんの欲しい値を取るには、

select SYS_CONTEXT ('USERENV', 'SID') from dual;

こちらですね・・・

ご指摘ありがとうございました。


また、関数名について回答していませんでした。
確実に使えるかは分からないですが、DBMS_UTILITY.FORMAT_CALL_STACKの戻り値のコールスタックの内容から取得できるかもしれません。
当方の環境(10g XE)で少し試してみました。
インデントしていないので見づらいですが・・

--ストアド名を返すファンクション
create or replace function get_name
return varchar2
is
callstack varchar2(2000);
currentname varchar2(2000);
begin
callstack := DBMS_UTILITY.FORMAT_CALL_STACK;
/*
コールスタックの最初には、このファンクション自身の情報が入っているため
2つ目のストアド名を取得する
*/
currentname := regexp_substr(callstack, 'procedure.+$|function.+$|package.+$',1,2,'im');
return currentname;
end;
/

--上記ファンクションを呼ぶだけのファンクション
create or replace function func_a return number
is
begin
dbms_output.put_line(get_name);
return 0;
end;
/

--プロシージャ
create or replace procedure proc_a
is
begin
dbms_output.put_line(get_name);
end;
/

--パッケージ
create or replace package pack_a is
procedure proc_a;
end;
/

create or replace package body pack_a is
procedure proc_a is
begin
dbms_output.put_line(get_name);
end;
end;
/

--無名ブロックで上記ファンクションらを実行
set serveroutput on
declare
w_num number;
begin
w_num := func_a; --function スキーマ名.FUNC_A
proc_a; --procedure スキーマ名.PROC_A
pack_a.proc_a; --package body スキーマ名.PACK_A
end;
/
set serveoutput off

無名ブロックのコード内にある、コメントの内容が出力されました。
パッケージの場合は、プロシージャ名までは取得できないようです。

参考になれば幸いです。
    • good
    • 0
この回答へのお礼

詳しい情報をありがとうございました
これからいろいろと試してみたいと思います

お礼日時:2012/11/20 15:00

蛇足(余計なお世話)ですが



SYS_CONTEXTで取得するSESSIONIDは、V$SESSIONのAUDSIDです。

念のためです。失礼しました。
    • good
    • 0

select SYS_CONTEXT ('USERENV', 'SESSIONID') from dual;



でセッションIDが取得できます。

http://docs.oracle.com/cd/E16338_01/server.112/b …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す