在Oracle中记录存储过程访问

时间:2011-11-16 21:40:27

标签: oracle stored-procedures oracle11g

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

例如,如果我想调用一个名为get_movie(id)的过程,该过程将根据id返回电影表中的一行,我将不得不做这样的事情get_movie(用户名,域名,IP,id),以便该过程可以记录发起过程调用的Web用户的用户/域/ IP。

似乎必须有更好的方法,但我对Oracle的了解有限。

3 个答案:

答案 0 :(得分:3)

每次获得连接时,我都会使用一个程序和sys_context设置公共参数

e.g:

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

Is there a way to communicate application context to a DB connection in non-Sybase DB servers (similar to set_appcontext in Sybase)?

答案 1 :(得分:0)

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

主要是因为来自oracle的用户可能是用户从您的应用程序连接到数据库的任何用户。 Oracle肯定知道用户连接,但我冒昧地猜测,如果不是所有对db的查询都是通过在某个属性文件中配置的单个用户完成的。

这就是为什么需要传入这些值的原因,因为应用程序与这些用户有连接并且可以知道他们的ip。但是,数据库并没有(希望)直接与直接连接的用户分开。

答案 2 :(得分:0)

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