在做实验的时候,编写关于“在存储过程中使用动态sql,建立一个统计表,并把统计结果,插入这个表中”的PL/sql语句在执行时出现权限不足的问题。

上网查询很多,看到了下面这篇博文(解决了我的问题)

两种解决办法

  • 在编写存储过程时加上authid current_user
  • 通过sys用户显式进行系统权限grant create table to hr(相应的用户名);


转载来的博文:

create or replace procedure p_create_table

Authid Current_User is

    begin

    Execute Immediate 'create table create_table(id int)';

    end p_create_table;

红色字体为关键  使用户可以使用权限执行execute

 

我们知道,用户拥有的role权限在存储过程是不可用的。遇到这种情况,我们一般需要显式进行系统权限,如grant create table to suk;但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程,实际上,oracle给我们提供了在存储过程中使用role权限的方法:修改存储过程,加入Authid Current_User时存储过程可以使用role权限。

我们知道,用户拥有的role权限在存储过程是不可用的。如:

    SQL> select * from dba_role_privs where grantee='SUK';

    GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE

    ------------ ------------ ------------ ------------

    SUK DBA NO YES

    SUK CONNECT NO YES

SUK RESOURCE NO YES

用户SUK拥有DBA这个role

再创建一个测试存储过程:

create or replace procedure p_create_table  is

begin

Execute Immediate 'create table create_table(id int)';

end p_create_table;

然后测试

    SQL>begin  p_create_table;  end;
    ORA-01031: 权限不足

    ORA-06512: 在"SUK.P_CREATE_TABLE", line 3

    ORA-06512: 在line 1

可以看到,即使拥有DBA role,也不能创建表。role在存储过程中不可用。遇到这种情况,我们一般需要显式进行系统权限,如grant create table to suk;

但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程。实际上,oracle给我们提供了在存储过程中使用role权限的方法:

修改存储过程,加入Authid Current_User时存储过程可以使用role权限。

    create or replace procedure p_create_table

    Authid Current_User is

    begin

    Execute Immediate 'create table create_table(id int)';

    end p_create_table;

再尝试执行:

SQL> exec p_create_table;

    PL/SQL procedure successfully completed

已经可以执行了。

==================================================================================

存储过程默认是用定义者definer 的身份调用的,如果加上AUTHID CURRENT_USER,则用当前登陆的用户权限调用,如果该过程的调用者(而非定义者)被授与系统权限execute any procedure或是被该过程的定义者grant execute on授权的话,不用这个AUTHID CURRENT_USER子句,调用者照样可以使用这个过程。

另外,在Oracle的存儲過程中,如果涉及到操作不同schema下的對象的時候,可以在不同的schema下寫相同的procedure,但這樣帶來的問題是維護和同步帶來了麻煩,可以在procedure中加上authid current_user,來說明procedure中操作的對象是當前連接用戶的對象而并不是procedure所屬用戶下的對象。

-- USER01
USER01@HUIYI>create table t
2 (
3 col1 varchar2(10)
4 )
5 / Table created. USER01@HUIYI>insert into t values(user); 1 row created. USER01@HUIYI>commit; Commit complete. USER01@HUIYI>select * from t; COL1
--------------------
USER01 -- USER02
USER02@HUIYI>create table t
2 (
3 col1 varchar2(10)
4 )
5 / Table created. USER02@HUIYI>insert into t values(user); 1 row created. USER02@HUIYI>commit; Commit complete. USER02@HUIYI>select * from t; COL1
--------------------
USER02 USER02@HUIYI>create or replace procedure pro_01
2 is
3 l_col1 varchar2(10);
4 begin
5 select col1 into l_col1 from t;
6 dbms_output.put_line(l_col1);
7 end;
8 / Procedure created. USER02@HUIYI>create or replace procedure pro_02
2 authid current_user
3 is
4 l_col1 varchar2(10);
5 begin
6 select col1 into l_col1 from t;
7 dbms_output.put_line(l_col1);
8 end;
9 / Procedure created. USER02@HUIYI>grant all on pro_01 to public; Grant succeeded. USER02@HUIYI>grant all on pro_02 to public; Grant succeeded. USER02@HUIYI>call pro_01();
USER02 Call completed. USER02@HUIYI>call pro_02();
USER02 Call completed. -- USER01
USER01@HUIYI>select * from t; COL1
--------------------
USER01 USER01@HUIYI>call user02.pro_01();
USER02 Call completed. USER01@HUIYI>call user02.pro_02();
USER01 Call completed.

【附:一文一图】


oracle中执行execute的时候报异常ORA-01031的解决办法的更多相关文章

  1. 将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法

    出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不S ...

  2. CRMEB中因为重写规则导致的服务器异常和404之解决办法

    问题描述:安装CRMEB后,只能通过https://域名//index.php/admin访问到后台,而不能直接通过https://域名/admin访问到后台,以至于导致进入系统后台出现有的功能界面可 ...

  3. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  4. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  5. MySQL 执行SQL脚本 报ERROR 1231 (42000)的解决办法【转】

    今天在source mysqldump 备份文件时,发现导入的过程中报如下的错误: ERROR 1231 (42000): Variable 'time_zone' can't be set to t ...

  6. MVC3在IIS7.5发布(部署)报403.14错误的解决办法

    MVC3在IIS7.5发布(部署)报403.14错误的解决办法     错误现象: 报403.14 forbidden错误 web服务器被配置为不列出此目录的内容. 解决办法: 检查站点的处理程序映射 ...

  7. 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

    原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...

  8. HTML中的select下拉框内容显示不全的解决办法

    HTML中的select下拉框内容显示不全的解决办法 今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了. 查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实 ...

  9. Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:

    Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...

随机推荐

  1. Android开发实例总结

    写一个修改密码的界面 1画界面总结: 需要弄清楚什么地方用相对布局,什么地方使用线性布局 希望这过后自己花时间去弄清楚他们内嵌的的所有组件以及组件的属性包括用法. 2逻辑总结: 逻辑描述总是那么几步的 ...

  2. Android 图片文字单位 px、dp、sp区别

    文章来源:http://www.cnblogs.com/bjzhanghao/archive/2012/11/06/2757300.html px:像素,一个像素点,1px代表屏幕上一个物理的像素点: ...

  3. 爬虫:Scrapy11 - Logging

    Scrapy 提供了 log 功能.可以通过 scrapy.log 模块使用.当前底层实现使用了 Twisted logging,不过可能在之后会有所变化. log 服务必须通过显式调用 scrapy ...

  4. win7下的nginx小demo

    一直大概知道nginx怎么玩,但是不看文档又蒙蔽.在这记录一下,以后好查看 下载tomcat,改index.jsp http://tomcat.apache.org/download-80.cgi t ...

  5. 【距离GDOI:131天】 后缀数组完毕

    用了近两周的时间,终于把罗神那篇后缀数组应用看完了,题目也写了一遍,T了无数次...详见前几篇博文... 后缀数组很重要的是那个height数组,可以用来做各种奇奇怪怪的东西...常用方法去是去二分, ...

  6. [bzoj] 1085 骑士精神 || ID-DFS

    原题 找到最少的步数成为目标状态. IDDFS(限制层数的dfs)即可 #include<cstdio> #include<algorithm> using namespace ...

  7. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  8. clips 前端 js 倒计时 获取验证码的按钮

    <a href="javascript:void(0);" onclick="get_captcha()" class="btn btn-def ...

  9. 【TEST】NOI-Linux可用 gedit c++精简配置 附Emacs日常配置

    这里是backup的测试随笔,用于测试 CSS / Markdown 效果. 同时也是是本菜鸡考场上一般使用的Gedit配置. 只有6行,挺短的.应该算好记吧. 使用之前记得勾选首选项里的外部工具. ...

  10. ios手机弹出层上表单的操作,收起键盘焦点错乱的问题

    今天遇到了ios手机下 弹出层上form表单 当收起键盘后,焦点错乱,无法再操作的问题 解决办法 function device() { const u = navigator.userAgent; ...