目的是向Web应用程序中的当前用户ID等触发器发送额外信息。由于使用了连接池,并且所有连接都使用相同的用户ID,如何将原始Web用户ID传递给触发器?它是一个基于Java的应用程序。
答案 0 :(得分:5)
如果您无法触摸应用程序代码,并且应用程序本身未将此信息传递给数据库,那么您将陷入僵局。将该信息提供给后端代码的唯一方法是让中间层传递它。
Oracle为应用程序提供了多种方法,可以将信息从中间层传递到后端,但必须构建应用程序才能利用它们。例如,DBMS_APPLICATION_INFO
包具有set_client_info
过程,允许中间层以您的后端触发器可以查询的中间层用户的名称传递。如果您想要更通用的机制,也可以使用Oracle contexts。但是,这些方法中的任何一种实际上都要求编写Java应用程序,以便在从连接池中检索连接时将此信息传递给后端。
答案 1 :(得分:1)
即使使用ConnectionPool,您也可以使用代理身份验证来识别用户。
一个例子:
me@XE> @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