필자는 Oracle 데이터베이스에 Java 저장 프로 시저 (Java Stored Procedure)를 가지고 있는데, 누가 그것을 호출했는지 알아야합니다. 나는 그것을 불렀던 사람에 따라 다른 일을하고 싶다. 나는 인터넷에서 이것을 봤지만 운이 없었다.Oracle Java 저장 프로 시저가 호출자를 알고 싶어합니까?
답변
여기 내 해결책이 있습니다. 그것은 주로 두 오라클의 기능으로 구성 :
는(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]
_Java : 여기
는 실행 결과인가? – Apurv다음을 체크 아웃 : 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 –
알아 두어야 할 * * *는 무엇입니까? – NINCOMPOOP