SET_CONTEXT ORA-01031: 权限不足

本文详细阐述了如何解决在Oracle中使用DBMS_SESSION执行权限不足的问题,并介绍了如何创建上下文以允许直接调用SET_CONTEXT或CLEAR_CONTEXT过程。文章还提供了必要的权限和步骤说明,帮助开发者避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过程就这样:
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
<think>嗯,用户遇到了ORA-65096错误,需要解决无效的通用用户名或角色名称的问题。首先,我得回忆一下Oracle数据库的相关知识。这个错误通常发生在12c及以上版本,特别是当用户尝试创建通用用户或角色时没有正确的权限或命名格式不对。 根据引用[2],创建用户时必须选择正确的容器,如果是本地用户,需要先切换到特定的可插拔数据库(PDB)。通用用户(Common User)的名字需要以C##或c##开头,否则会触发这个错误。所以,用户可能没有使用正确的前缀,或者没有在正确的容器下操作。 接下来,可能的解决方案包括:1. 检查当前是否在CDB$ROOT容器下创建通用用户,如果是,确保用户名以C##开头。2. 如果是要在PDB中创建本地用户,需要先切换到目标PDB,然后创建不带前缀的用户。3. 修改用户名格式,添加C##前缀。此外,权限问题也可能导致错误,需要确保用户有CREATE USER的权限,并且使用ALTER SESSION切换容器。 可能还需要检查Oracle的版本,确认是否是12c或更高,因为这个问题主要出现在这些版本中。用户可能需要使用ALTER SESSION SET CONTAINER = pdbname;来切换到PDB,然后再创建用户。同时,如果用户确实需要创建通用用户,必须确保命名符合规范,并且有足够的权限。 另外,引用[2]还提到,如果希望为某个PDB创建本地用户,必须先选择该PDB。所以,用户可能错误地在根容器下创建本地用户,而没有切换到对应的PDB。需要指导用户如何查看当前容器,以及如何切换容器。例如,使用SHOW CON_NAME查看当前容器,再用ALTER SESSION切换。 总结下来,解决步骤应该是:确认要创建的是通用用户还是本地用户,检查命名是否符合规范,切换到正确的容器,确保有足够的权限。同时,提供具体的SQL命令示例,帮助用户一步步操作。此外,提醒用户注意版本差异,避免在错误的上下文中执行命令。</think>### ORA-65096错误解决方案 **错误原因** ORA-65096表示在Oracle 12c及以上版本中尝试创建通用用户(Common User)或角色时,未遵循命名规范或操作环境不正确。具体原因包括: 1. **命名格式错误**:通用用户名需以`C##`或`c##`开头(例如`C##test_user`)[^2]。 2. **容器环境错误**:未在正确的容器(CDB或PDB)中操作。通用用户需在根容器(CDB$ROOT)中创建,而本地用户需在可插拔数据库(PDB)中创建。 3. **权限不足**:缺少`CREATE USER`权限或未启用`ALTER SESSION`切换容器。 --- ### 分步解决方案 1. **确认操作目标** - 若需创建**通用用户**(跨所有PDB),必须使用`C##`前缀。 - 若需创建**本地用户**(仅限单个PDB),需先切换到目标PDB。 2. **检查当前容器** 执行以下SQL确认当前容器环境: ```sql SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS current_container FROM DUAL; ``` 3. **通用用户创建方法** - 确保当前在根容器(CDB$ROOT): ```sql ALTER SESSION SET CONTAINER = CDB$ROOT; ``` - 创建用户时添加`C##`前缀: ```sql CREATE USER C##test_user IDENTIFIED BY password; ``` 4. **本地用户创建方法** - 切换到目标PDB(例如`PDBORCL`): ```sql ALTER SESSION SET CONTAINER = PDBORCL; ``` - 创建不带前缀的用户: ```sql CREATE USER local_user IDENTIFIED BY password; ``` 5. **权限验证** 确保当前用户拥有`CREATE USER`权限: ```sql GRANT CREATE USER TO current_user; ``` --- ### 示例操作流程 ```sql -- 切换到PDB ALTER SESSION SET CONTAINER = ORCLPDB1; -- 创建本地用户 CREATE USER app_user IDENTIFIED BY Welcome123; -- 授权并分配表空间 GRANT CONNECT, RESOURCE TO app_user; ALTER USER app_user DEFAULT TABLESPACE users QUOTA UNLIMITED ON users; ``` --- ### 相关问题 1. **如何查看所有PDB的列表?** ```sql SELECT NAME, OPEN_MODE FROM V$PDBS; ``` 2. **ORA-65049错误如何解决?** 该错误通常因未切换到PDB直接创建本地用户导致,需先执行`ALTER SESSION SET CONTAINER`。 3. **通用用户与本地用户的权限差异?** 通用用户可跨多个PDB管理对象,而本地用户仅限单个PDB。权限分配需通过`COMMON`关键字指定(例如`GRANT CREATE SESSION TO C##admin CONTAINER=ALL;`)。 --- **引用说明** [^1]: ORA-06508错误通常与程序单元缺失相关,与本问题无直接关联。 : Oracle官方文档明确要求通用用户需以`C##`开头,并在正确容器中操作。 [^3]: 部分Oracle错误可通过版本兼容性调整解决,但ORA-65096需严格遵循命名规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值