【发布时间】:2012-01-19 15:12:35
【问题描述】:
目的是向触发器发送额外信息,例如来自 Web 应用程序的当前用户 ID。由于使用了连接池,并且所有连接都使用相同的用户 ID,我如何传递原始 Web 用户 ID 来触发?它是一个基于 java 的应用程序。
【问题讨论】:
标签: java oracle jakarta-ee triggers audit
目的是向触发器发送额外信息,例如来自 Web 应用程序的当前用户 ID。由于使用了连接池,并且所有连接都使用相同的用户 ID,我如何传递原始 Web 用户 ID 来触发?它是一个基于 java 的应用程序。
【问题讨论】:
标签: java oracle jakarta-ee triggers audit
如果您无法接触应用程序代码并且应用程序本身尚未将这些信息传递给数据库,那么您就陷入了僵局。使该信息可用于后端代码的唯一方法是让中间层将其传入。
Oracle 为应用程序提供了多种将信息从中间层传递到后端的方法,但必须构建应用程序才能利用这些方法。例如,DBMS_APPLICATION_INFO 包有一个set_client_info 过程,该过程允许中间层传递您的后端触发器可以查询的中间层用户的名称。如果您想要更通用的机制,也可以使用Oracle contexts。然而,这些方法中的任何一种实际上都需要编写 Java 应用程序,以便在从连接池中检索连接时将此信息传递给后端。
【讨论】:
即使使用 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
【讨论】: