SET_CONTEXT ORA-01031: 权限不足

过程就这样:
create or replace package body parp_set_user_pkg is
procedure set_user_id(user_id varchar2)
is
begin
    DBMS_SESSION.SET_CONTEXT('ctx_parp_set_user','user_id',user_id);
end set_user_id;


FUNCTION get_user_id RETURN VARCHAR2 IS
  v_user_id VARCHAR2(200);
BEGIN
    SELECT SYS_CONTEXT('ctx_parp_set_user','user_id') INTO v_user_id FROM DUAL;
  IF v_user_id IS NULL THEN
    SELECT USER INTO v_user_id FROM DUAL;
  END IF;
RETURN v_user_id;
end get_user_id;


end parp_set_user_pkg;


调用的时候总是报权限不足:
--- Cause: java.sql.SQLSyntaxErrorException: ORA-01031: 权限不足
ORA-06512: 在 "SYS.DBMS_SESSION", line 101
ORA-06512: 在 "PARPDATA.PARP_SET_USER_PKG", line 5
ORA-06512: 在 line 1


处理过程:
因为报的是SYS.DBMS_SESSION不足,所以授予了这个的执行权限!
SQL> grant execute on sys.DBMS_SESSION to parpdata;


Grant succeeded.
but还是不行,赶紧崩溃啊!明明报这个权限不足,授权了还是没有权限!
然后把另外一个库data的权限copy了一份应用到这个库上,还是不行。。
仔细在看了下过程,有set_context,是不是这个的问题呢?
在建立上下文的时候指定了PACKAGE,此后设置上下文或清除上下文设置都需要通过这个包的过程来完成,如果直接尝试调用SET_CONTEXT或CLEAR_CONTEXT则会报错权限不足:


SQL> CREATE OR REPLACE CONTEXT CTX_PARP_SET_USER
  2   USING PARPDATA.PARP_SET_USER_PKG
  3  /


Context created.   
context的名字可以随便取,但是using后面的必须是package的名字。而且如果不是在相同用户下上属主才行。


至少需要的权限:
GRANTEE      PRIVILEGE             ADM 
-----------  -----------------     ---- 
SCOTT        DROP ANY CONTEXT      NO 
SCOTT        CREATE ANY CONTEXT    NO 
SCOTT        UNLIMITED TABLESPACE  NO 
SCOTT        ALTER SESSION         NO

你可能感兴趣的:(oracle)