定义者权限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的作用是允许用户修改其他用户的会话,而非自己的。回到测试场景:
- 定义者权限的存储过程
alter_session执行时,CURRENT_USER会切换为存储过程所有者,但它执行的ALTER SESSION语句作用的对象是调用者(用户A)的当前会话。 - 用户A作为该会话的所有者,本身就具备修改自身会话的固有权限,不需要依赖角色或显式授予的系统权限,因此即使存储过程执行时仅启用PUBLIC角色,操作依然能成功完成。
内容的提问来源于stack exchange,提问作者Alex Bartsmon
相关产品推荐
相关产品推荐

