2013-04-29 1 views
0

필자는 Oracle 데이터베이스에 Java 저장 프로 시저 (Java Stored Procedure)를 가지고 있는데, 누가 그것을 호출했는지 알아야합니다. 나는 그것을 불렀던 사람에 따라 다른 일을하고 싶다. 나는 인터넷에서 이것을 봤지만 운이 없었다.Oracle Java 저장 프로 시저가 호출자를 알고 싶어합니까?

+0

_Java : 여기

는 실행 결과인가? – Apurv

+0

다음을 체크 아웃 : http://stackoverflow.com/questions/250792/how-do-i-log-trace-oracle-stored-procedure-calls-with-parameter-values ​​ 에 http : //stackoverflow.com/questions/8159127/logging-stored-procedure-access-in-oracle –

+0

알아 두어야 할 * * *는 무엇입니까? – NINCOMPOOP

답변

7

여기 내 해결책이 있습니다. 그것은 주로 두 오라클의 기능으로 구성 :

(1) SYS_CONTEXT function :

SYS_CONTEXT('USERENV', 'SESSION_USER')는 로그온시 데이터베이스 사용자의 이름을 반환합니다. 이 값은 세션 기간 동안 동일하게 유지됩니다.

SYS_CONTEXT('USERENV', 'CURRENT_USER')은 현재 권한이있는 데이터베이스 사용자의 이름을 반환합니다.

목적에 따라 이러한 함수 중 하나 또는 둘 모두를 사용할 수 있습니다. 예제에서는 두 가지를 모두 사용하겠습니다.

(2) Server-Side Internal Driver :

내부 드라이버가 본질적으로 오라클 데이터베이스와 자바 가상 머신 (JVM)에 연결되는 서버 쪽. 드라이버는 데이터베이스와 동일한 프로세스의 일부로 실행됩니다. 또한 JVM이 시작된 동일한 세션 인 기본 세션 내에서 실행됩니다.

내 지식으로는이 기능이 없으면이 데모가 작동하지 않습니다. SYS_CONTEXT 함수를 실행하기 때문에 데이터베이스에 연결해야합니다. 그러나이 경우 데이터베이스에 연결하는 데 사용하는 동일한 SESSION_USER을 얻게됩니다. 또 다른 문제는 현재 함수 호출의 컨텍스트가 느슨 할 것이라는 것입니다. 내가 원한 것은 현재 함수 호출에 대한 정보를 얻는 것이다. 이 기능을 통해 필요한 정보를 얻을 수 있습니다.

class Demo{ 

    public static java.lang.String getUser() 
             throws java.sql.SQLException { 

    java.sql.Statement stmt = null; 
    java.sql.ResultSet rs = null; 

    try{ 
     java.sql.Connection con = 
       java.sql.DriverManager.getConnection("jdbc:default:connection"); 

     java.lang.String query = 
        "SELECT SYS_CONTEXT('USERENV', 'CURRENT_USER')," + 
        "SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL"; 


     stmt = con.createStatement(); 
     rs = stmt.executeQuery(query); 

     rs.next(); 

     return "Current User: [" + rs.getString(1) + "] ; " + 
       "Session User: [" + rs.getString(2) + "]"; 
    } 
    finally{ 
     rs.close(); 
     stmt.close(); 
    } 

    } 

} 

PL/SQL 래퍼 코드 : 여기

은 작업 예입니다

CREATE OR REPLACE FUNCTION MyFunc 
RETURN VARCHAR2 
AS 
LANGUAGE JAVA 
NAME 'Demo.getUser() return java.lang.String'; 

이 기능은 SYS에서 생성 및 기능에 EXECUTE 특권 SCOTT 부여했다. 내 오라클 database_에 저장 프로 시저

MYFUNC 
---------------------------------- 
Current User: [SYS] ; Session User: [SCOTT]