2011-12-13 18 views
4

目的是從Web應用程序向觸發器(如當前用戶標識)發送額外信息。由於使用了連接池,並且所有連接都使用相同的用戶標識,因此我如何傳遞原始Web用戶標識來觸發?這是一個基於Java的應用程序。如何發送參數以在Oracle中觸發

回答

5

如果您無法觸摸應用程序代碼,並且應用程序本身不會將此信息傳遞到數據庫,那麼您處於僵局。將信息提供給後端代碼的唯一方法是讓中間層通過它。

Oracle爲應用程序將信息從中間層傳遞到後端提供了多種方式,但應用程序必須建立以利用它們。例如,DBMS_APPLICATION_INFO程序包有一個set_client_info過程,允許中間層傳遞後端觸發器可以查詢的中間層用戶的名稱。如果您想要更通用的機制,也可以使用Oracle contexts。但是,這兩種方法都實際上要求編寫Java應用程序,以便在從連接池檢索連接時將此信息傳遞到後端。

+0

謝謝你,是set_client_info與當我使用一個用戶名,以連接到Oracle的工作? – Koptan 2011-12-14 08:04:40

1

即使使用ConnectionPool,也可以使用代理身份驗證來識別用戶。

一個例子:

[email protected]> @man proxy 

[ P R O X Y A U T H E N T I C A T I O N ] 

drop user application_user 
drop user end_user 


-- let's create the application user which all users 
-- need to connect through. 
-- This user is meant as the middle-tier-user in a 
-- multi-tier setup. 
create user application_user identified by application_user 

-- create an end-user 
create user end_user identified by end_user 
quota unlimited on users 

grant create session, create table to end_user 

-- this is the clause to grant access to end_user. 
alter user end_user grant connect through application_user 

-- now, we can connect WITHOUT PASSWORD! 
@connect application_user[end_user]/application_user 

-- this should display "END_USER" 
select user from dual 

-- this should display "APPLICATION_USER" 
column proxy_user format a30 
select sys_context('userenv', 'proxy_user') proxy_user from dual 

http://blogs.oracle.com/jheadstart/entry/using_proxy_authentication