故障005:普通用户debug调试报错无执行权限
DM技术交流QQ群:940124259
1. 问题描述
某行DBA人员打电话向我询问,在DM管理工具中,且调试自己用户模式下的存储过程或者函数,调试报错提示 “没有执行权限,请重新编辑用于调试的sql语句”
,为何不能调试?
照理来说,自己模式的存储过程直接调用没问题,从而引出怀疑存储过程里面代码对某些无访问权限的对象。经仔细查看,代码里对表的访问也属于本模式中的,所以存储过程中
不存在无访问权限的对象。暴力快捷方式,直接给个DBA角色权限不就完了吗。其实不然,尤其是针对金融行业,对业务系统中的用户权限和操作权限要求非常严格。
现场报错截图:
2. 案例重现
2.1 新建普通用户
create user cqsoft identified by "cqsoft";
grant resource, vti, soi to cqsoft; -- 基础权限分配
2.2 构造一张表和存储过程
提示:使用cqsoft账户登录后,执行以下SQL代码。
-- 建t2表
drop table if exists t2;
create table t2
as
select 63 + level v1, chr(63 + level) v2
from dual
connect by level <= 5;
-- sp_myproc存储过程
-- 存储过程中穿插本模式下表的查询代码,为验证访问自身表的问题。
create or replace procedure sp_myproc (c1 in int, c2 in int, c3 out int)
is
v_max int := 0;
begin
select max(v1) into v_max from t2;
c3 = c1 + c2 + v_max;
end;
2.2 重现调试报错
3. 解决方法
3.1 方法一:分配DBA权限(不建议)
尽量缩小用户的权限操作,实现各司其职的功能,即什么样的角色用户仅分配权力以内的事,过多权限带来维护的风险性(并不是危言耸听
),因为每个人的技术水平不一样。
某XX账户临时使用一下调试,在其公司内部的决策允许下,可通过DBA角色解决。
-- SYSDBA账户或带有DBA管理权限并享有转赠权限的用户(WITH ADMIN OPTION)。
grant dba to cqsoft;
-- 调试完请记得立即回收DBA权限。
revoke dba from cqsoft;
3.2 方法二:单独赋权(建议)
需要初始化DBG_PKG调试包,使用SYSDBA账户分配相应的包执行权限给调试用户。
sp_init_dbg_sys(1);
grant execute on sys.dbg_pkg to cqsoft;