在Oracle中记录存储过程访问



是否有一种方便的方法来记录从Oracle内部访问存储过程?我是一名web开发人员,目前我们需要将各种用户信息传递给许多存储过程,以便这些过程可以反过来调用另一个过程,该过程记录对表中原始存储过程的访问。

例如,如果我想调用一个名为get_movie(id)的过程,它将根据id从电影表中返回一行,我必须执行类似于get_movie(username, domain, ip, id)的操作,以便该过程可以记录发起该过程调用的web用户的用户/域/ip。

似乎一定有更好的方法,但是我对Oracle的了解有限。

我会在每次获得连接时使用过程和sys_context设置公共参数

例句:

CREATE OR REPLACE PROCEDURE set_context
(
    v_userid IN VARCHAR2,
    v_domain IN VARCHAR2,
    v_ip IN VARCHAR2,
    v_id IN VARCHAR2
)
AS
BEGIN 
    DBMS_SESSION.SET_CONTEXT('SESSIONCONTEXT', 'username', v_userid); 
    DBMS_SESSION.SET_CONTEXT('SESSIONCONTEXT', 'domain', v_domain); 
    DBMS_SESSION.SET_CONTEXT('SESSIONCONTEXT', 'ip', v_ip); 
    DBMS_SESSION.SET_CONTEXT('SESSIONCONTEXT', 'id', v_id); 
END;

和查询值:

SELECT SYS_CONTEXT('SESSIONCONTEXT', 'username') FROM dual; 

见:http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions182.htm和

是否有一种方法可以将应用程序上下文通信到非Sybase DB服务器中的DB连接(类似于Sybase中的set_appcontext)?

这可能是不可能的。(警告即将到来的许多假设)

主要是因为从oracle的角度来看,用户可能是从应用程序连接到数据库的任何用户。Oracle当然知道用户连接,但我冒昧地猜测,大多数(如果不是全部的话)对数据库的查询都是通过在某个属性文件中配置的单个用户完成的。

这就是需要传入这些值的原因,因为应用程序与这些用户有连接,并且可以知道它们的ip。然而,数据库并没有(希望)从直接连接的用户中分割出来。

另一种选择是为每个"最终用户"打开一个oracle用户,并授予他们访问业务逻辑所在模式的权限。使用公共同义词

最新更新