You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定义者权限PL/SQL单元为何能执行ALTER SESSION会话修改操作?

定义者权限PL/SQL单元执行会话修改的权限疑问解析

参考规则(Oracle 19c PL/SQL文档)

在服务器调用期间,当DR(DEFINER RIGHT,定义者权限)单元被推入调用栈时,数据库会存储当前启用的角色以及CURRENT_USER和CURRENT_SCHEMA的当前值。随后将CURRENT_USER和CURRENT_SCHEMA均更改为DR单元的所有者,并且仅启用唯一角色PUBLIC。

权限验证查询

select * 
  from dba_sys_privs 
 where     grantee   in ('A', 'PUBLIC') 
       and privilege  = 'ALTER SESSION'
/
-- no rows returned
  • PUBLIC未被授予ALTER SESSION系统权限
  • 用户A未直接被授予ALTER SESSION系统权限,仅通过角色获得该权限

测试用存储过程

create or replace procedure alter_session
  as
  begin
    execute immediate 'alter session force parallel ddl';
  end;
/

测试执行过程

SQL*Plus: Release 19.0.0.0.0 - Production on Sat May 13 20:09:02 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Sat May 13 2023 20:08:48 -04:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> alter session enable parallel ddl
  2  /

Session altered.

SQL> select pddl_status from v$session where username = 'A'
  2  /

PDDL_STA
--------
ENABLED

SQL> begin
  2    alter_session();
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select pddl_status from v$session where username = 'A'
  2  /

PDDL_STA
--------
FORCED

问题

尽管定义者权限PL/SQL程序单元(alter_session())执行时未使用用户A的角色,但用户A为何仍能通过调用alter_session()修改其会话?

原因解析

核心原因在于ALTER SESSION权限的特殊性:任何用户都默认拥有修改自身当前会话的权限,无需额外授予ALTER SESSION系统权限。

系统权限ALTER SESSION的作用是允许用户修改其他用户的会话,而非自己的。回到测试场景:

  1. 定义者权限的存储过程alter_session执行时,CURRENT_USER会切换为存储过程所有者,但它执行的ALTER SESSION语句作用的对象是调用者(用户A)的当前会话。
  2. 用户A作为该会话的所有者,本身就具备修改自身会话的固有权限,不需要依赖角色或显式授予的系统权限,因此即使存储过程执行时仅启用PUBLIC角色,操作依然能成功完成。

内容的提问来源于stack exchange,提问作者Alex Bartsmon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:17:25