如何发送参数以在Oracle中触发

时间:2011-12-13 18:42:20

标签: java oracle java-ee triggers audit

目的是向Web应用程序中的当前用户ID等触发器发送额外信息。由于使用了连接池,并且所有连接都使用相同的用户ID,如何将原始Web用户ID传递给触发器?它是一个基于Java的应用程序。

2 个答案:

答案 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