问题描述:

如表rm_circuit是a用户的,授予b用户select,insert,update,delete权限,在b用的存储过程中执行dbms_stats.gather_table_stats提示:ora-020000:unable to analyze table "a"."rm_circuit",insufficient privileges or does not exist.但是直接在plsql中在b用户下执行begin dbms_stats.gather_table_stats('a','rm_circuit');end;可以成功执行。如果没有权限,怎么b用户用plsql就可以执行呢

问题原因:

procedure需要显示的授权,虽然对表已经授权了,但是在过程中是无效的。

解决办法:

1、在过程中加上对表进行授权的操作;

2、在过程中加上 AUTHID CURRENT_USER 。

之前就接触过几次 AUTHID CURRENT_USER ,但是也没仔细的研究过。今天花了大半天时间测试测试了这个东西的使用。具体如下:

AUTHID CURRENT_USER
如果在包中或过程中加上 AUTHID CURRENT_USER 表示以调用者的身份执行。默认情况下以定义者身份执行。
定义者身份:在执行中,当前用户只有除角色权限外的权限。
调用者身份:在执行中,当前用户拥有已经授以的所有权限(包含角色权限和系统权限)。

测试1:
GWM用户拥有的角色权限和系统权限如下所示:

执行用户:gwm。分析的表:lttfm用户下的b$i_exch_info表。
1、在平常的plsql中执行如下语句,以下语句分析表成功,说明该用户即使没有显式的授权分析任何表的权限,但是由于该用户具有dba角色权限可以进行分析任何表
begin dbms_stats.gather_table_stats('lttfm','b$i_exch_info');end;--执行成功

2、用过程对表进行分析。执行失败。说明在执行过程时默认是以定义者身份执行,对于角色权限是无效的。
CREATE OR REPLACE PROCEDURE p_authiduser_test  IS
BEGIN
    dbms_stats.gather_table_stats('lttfm','b$i_exch_info');
END p_authiduser_test;

执行过程提示错误:
SQL> EXEC gwm.p_authiduser_test;
begin gwm.p_authiduser_test; end;
 
ORA-20000: Unable to analyze TABLE "LTTFM"."B$I_EXCH_INFO", insufficient privileges or does not exist
ORA-06512: 在 "SYS.DBMS_STATS", line 13046
ORA-06512: 在 "SYS.DBMS_STATS", line 13076
ORA-06512: 在 "GWM.P_AUTHIDUSER_TEST", line 6
ORA-06512: 在 line 2

3、对gwm用户授以分析任何表的权限,执行过程成功。说明定义者身份执行过程只认显式授以的权限。
grant analyze any to gwm;

SQL> EXEC gwm.p_authiduser_test;
PL/SQL procedure successfully completed

4、或者收回分析任何表权限,在过程上加上 AUTHID CURRENT_USER。执行如下过程,也可以成功执行。说明过程以调用者身份执行能够识别角色权限。
revoke analyze any from gwm;
CREATE OR REPLACE PROCEDURE p_authiduser_test AUTHID CURRENT_USER IS
BEGIN
    dbms_stats.gather_table_stats('lttfm','b$i_exch_info');
END p_authiduser_test;

测试2:以另一个用户来执行
revoke analyze any from gwm;
转到ltwebgis用户
执行如下过程无法成功执行。仍然如测试1中2的提示:
CREATE OR REPLACE PROCEDURE p_authiduser_test IS
BEGIN
    dbms_stats.gather_table_stats('lttfm','b$i_exch_info');
END p_authiduser_test;

如果对gwm授以分析任何表权限或者直接在过程中加上 AUTHID CURRENT_USER ,在ltwebgis用户下执行过程也可以成功创建表。
SQL> EXEC gwm.p_authiduser_test;
PL/SQL procedure successfully completed

测试3:测试 AUTHID CURRENT_USER 在执行过程中对操作用户的影响
测试过程:创建该过程的用户:gwm
CREATE OR REPLACE PROCEDURE p_authiduser_test IS
  v_session_user   VARCHAR2(255);
  v_current_user   VARCHAR2(255);
  v_current_schema VARCHAR2(255);
BEGIN
  SELECT sys_context('userenv', 'session_user') session_user,
         sys_context('userenv', 'current_user') current_user,
         sys_context('userenv', 'current_schema') current_schema
    INTO v_session_user, v_current_user, v_current_schema
    FROM dual;
  dbms_output.put_line('session_user:'||v_session_user);
  dbms_output.put_line('current_user:'||v_current_user);
  dbms_output.put_line('current_schema:'||v_current_schema);
  /*dbms_stats.gather_table_stats('lttfm', 'b$i_exch_info');*/
END p_authiduser_test;

gwm用户下执行该过程:
SQL> SET SERVEROUTPUT ON;
SQL>  EXEC p_authiduser_test;
session_user:GWM
current_user:GWM
current_schema:GWM

转到ltwebgis用户下执行:
SQL> SET SERVEROUTPUT ON;
SQL> EXEC gwm.p_authiduser_test;
session_user:LTWEBGIS
current_user:GWM
current_schema:GWM

修改过程如下,即加上AUTHID CURRENT_USER

CREATE OR REPLACE PROCEDURE p_authiduser_test AUTHID CURRENT_USER IS
  v_session_user   VARCHAR2(255);
  v_current_user   VARCHAR2(255);
  v_current_schema VARCHAR2(255);
BEGIN
  SELECT sys_context('userenv', 'session_user') session_user,
         sys_context('userenv', 'current_user') current_user,
         sys_context('userenv', 'current_schema') current_schema
    INTO v_session_user, v_current_user, v_current_schema
    FROM dual;
  dbms_output.put_line('session_user:'||v_session_user);
  dbms_output.put_line('current_user:'||v_current_user);
  dbms_output.put_line('current_schema:'||v_current_schema);
  /*dbms_stats.gather_table_stats('lttfm', 'b$i_exch_info');*/
END p_authiduser_test;

gwm用户下执行:
SQL> SET SERVEROUTPUT ON;
SQL>  EXEC p_authiduser_test;
session_user:GWM
current_user:GWM
current_schema:GWM

转到ltwebgis用户下执行:
SQL> SET SERVEROUTPUT ON;
SQL> EXEC gwm.p_authiduser_test;
session_user:LTWEBGIS
current_user:LTWEBGIS
current_schema:LTWEBGIS

如测试3可得出:
1、如果是本用户gwm执行,不管是否加上 AUTHID CURRENT_USER 即不管是以定义者还是调用者身份执行,其打开的会话,当前用户,当前的模式都是gwm,唯一的区别是不同身份的执行其获取的权限不同。
2、如果是用别的用户ltwebgis用户来执行,如果不加 AUTHID CURRENT_USER ,只是打开的会话用户是ltwebgis,执行过程的当前用户和当前模式都是gwm;但是如果加上 AUTHID CURRENT_USER ,则执行的时候就完全是以ltwebgis用户进行操作了,创建的表使用的表都是以ltwebgis用户所拥有的。

如下过程创建一个表:该过程是gwm用户下的。
CREATE OR REPLACE PROCEDURE p_authiduser_test AUTHID CURRENT_USER IS
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE fyzh_test (id NUMBER,name VARCHAR2(255))';
END p_authiduser_test;
如果是gwm用户执行,不管是否加了AUTHID CURRENT_USER,创建的表都是gwm用户下的;但是如果是在ltwebgis用户执行该过程,不加
AUTHID CURRENT_USER 这个的话,执行其过程创建的表是gwm用户的(如上结论可知其执行的用户仍为gwm),如果加了 AUTHID CURRENT_USER,
创建的表就是ltwebgis用户下的(如上结论可知加上AUTHID CURRENT_USER这个,在ltwebgis用户下执行该过程其操作的用户就是ltwebgis)。

随后又出现了问题:

在过程中加入AUTHID CURRENT_USER后,手动执行该过程倒是可以了,但是发现job执行仍然无法成功,仍提示没有足够的权限。

看来对于job无法识别AUTHID CURRENT_USER。没找到更好的办法,只能先显式的对用户进行授权,解决该问题。

转载于:https://www.cnblogs.com/lanzi/archive/2011/08/17/2143554.html

plsql可执行别的用户对象,过程却不行(AUTHID CURRENT_USER)相关推荐

  1. vbs 连oracle 负载均衡,(原)QTP中用VBS调用PLSQL并执行相关语句

    今天工作的需求是要在录制一段web程序之前要调用plsql并执行一段数据库代码清空相关数据才能做web录制测试, 本来是想用QTP直接录制plsql的,但是后来发现自己对qtp录制window app ...

  2. js 执行环境 活动对象 变量对象 作用域链的理解

    看一下是知乎大神对于 js 执行环境 活动对象 变量对象 作用域链的解释 假设在全局环境下定义了函数pub()和变量pubvar: var pubvar = 1; function pub () {v ...

  3. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  4. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  5. 执行execute时对象名 retime_record 无效_MyBatis 的执行流程怎么可以讲的这么透彻

    前言 MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下: 1.Mapper接口和映射文件是如何进行绑定的 2.MyB ...

  6. laravel-admin微信网页授权获取用户信息过程

    最近在重构我们平台得前端页面以及逻辑,再此记录一下微信网页版授权获取用户资料得过程 第一步,安装 composer require "overtrue/laravel-wechat:~3.0 ...

  7. plsql快捷执行方式_总结PLSQL的快捷键以及使用技巧

    http://www.dedecms.com/knowledge/data-base/oracle/2012/0724/3643.html 最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他 ...

  8. js引擎执行js代码的过程

    js引擎执行js代码的过程 html解析 浏览器下载网页时,浏览器内核解析html.当遇到script标签时,下载js代码并将js代码以流的形式传递给js引擎让js引擎进行js代码的解析. 语义语法分 ...

  9. 把指定用户的命令写在/home/etc/rc.local中,系统开机时就会自动执行指定用户的命令。

    把指定用户的命令写在/home/etc/rc.local中,系统开机时就会自动执行指定用户的命令.

  10. 私有句柄表(内核对象,并非用户对象),全局句柄表

    文章目录 私有句柄表 1.什么是句柄(内核对象) 2.为什么要有句柄? Windows设计理念: 3.句柄表在哪? 全局句柄表 注意 私有句柄表 1.什么是句柄(内核对象) 当一个进程创建或者打开一个 ...

最新文章

  1. Linux-locate/slocate命令
  2. TensorFlow 教程——电影评论文本分类
  3. Python_面向对象_递归
  4. Duilib实现圆形头像控件
  5. 剪板机自动上下料_机器人联轴器,用于机器人自动化上下料
  6. plsql表设置主键_对复制实施主键约束
  7. Android 进阶第二篇——性能优化
  8. SprinBoot整合SSM之添加
  9. 启动数据库时提示ORA-03113: 通信通道的文件结尾解决方法
  10. 开学了,一切都要开始了!
  11. 微软Azure、谷歌GAE、亚马逊AWS比較
  12. python大数据培训班
  13. 亲手将TP-LINK路由器改装成交换机使用
  14. 一次投诉淘宝卖家的过程
  15. 无法搜索到对方电脑共享的文件
  16. 《战神3》GDC技术制作团队研讨报导
  17. 百度账号管理静态页面
  18. Threejs实现卫星太阳板折叠动画,信号发射,姿态调整
  19. hadoop103 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
  20. 智慧监所三维可视化决策系统平台(数字孪生)-解决方案开发案例

热门文章

  1. OpenCV 线性滤波
  2. Sqlalchemy 乱码解决方法
  3. 【BZOJ5093】图的价值
  4. 高性能集群软件Keepalived之安装配置篇
  5. 在ASP.NET Web API2中启用Cross-Origin请求
  6. Processing编程学习指南2.5 Processing中的代码
  7. Android TextView 实现文字大小不同和文字颜色不同
  8. BAT Java面试154道题分享!搞懂轻松进BAT
  9. 逃离北京?作为程序员的我在工作两个月的今天,露宿街头
  10. 抛开复杂的架构设计,MySQL优化思想基本都在这了