在做实验的时候,编写关于“在存储过程中使用动态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. 数据库——mysql内置功能(11)

    1.视图 视图是一个虚拟表(非真实存在),其本质是(根据SQL语句获取动态的数据集,并未其命名),用户使用时只需使用(名称)即可获取结果集,可以将该结果集当做表来使用 使用视图我们可以把查询过程中的临 ...

  2. ES6常用片段

    promise: --在return里面: methods:{ getSellData(){ return axios.get('/api/seller').then((res=>{ retur ...

  3. ssh.sh_for_ubuntu1404

    #!/bin/bash sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config s ...

  4. css深入理解relative

    第一讲     relative和absolute相煎关系 同源性 .position:relative .position:absolute 限制作用 1.限制left/top/right/bott ...

  5. Axure+SVN——实现多人团队开发

    最近进行考试系统重构,一个小组十几个人,这么多人要同时搞需求画原型.这样原本的合作开发工具SVN已经不能满足现在的需求了,这是就找到了一个新的方法--Axure+SVN. 在SVN服务器端建立一个空的 ...

  6. FreeBSD NTP 简单使用

    FreeBSD NTP 简单使用 来源 https://blog.csdn.net/stevexk/article/details/1349506 1.ntptrace xxx.xxx.xxx.xxx ...

  7. [洛谷P3805]【模板】manacher算法

    题目大意:给你一个字符串,求出它的最长回文字段 题解:$manacher$算法 卡点:$p$数组未开两倍空间 C++ Code: #include <cstdio> #include &l ...

  8. BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】

    题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...

  9. BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】

    题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...

  10. urllib2.URLError: <ulropn error [Errno 10060] >

    在抓网页的时候,如果抓取频率很高,很容易出现这个错误: 意思是服务器拒绝响应.解决的方法为,隔段时间再试,不过这个方法不靠谱.靠谱的方法是增加一个延迟函数 import time time.sleep ...