oracle中执行execute的时候报异常ORA-01031的解决办法
在做实验的时候,编写关于“在存储过程中使用动态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的解决办法的更多相关文章
- 将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法
出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不S ...
- CRMEB中因为重写规则导致的服务器异常和404之解决办法
问题描述:安装CRMEB后,只能通过https://域名//index.php/admin访问到后台,而不能直接通过https://域名/admin访问到后台,以至于导致进入系统后台出现有的功能界面可 ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- Oracle中执行存储过程call和exec区别
Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...
- MySQL 执行SQL脚本 报ERROR 1231 (42000)的解决办法【转】
今天在source mysqldump 备份文件时,发现导入的过程中报如下的错误: ERROR 1231 (42000): Variable 'time_zone' can't be set to t ...
- MVC3在IIS7.5发布(部署)报403.14错误的解决办法
MVC3在IIS7.5发布(部署)报403.14错误的解决办法 错误现象: 报403.14 forbidden错误 web服务器被配置为不列出此目录的内容. 解决办法: 检查站点的处理程序映射 ...
- 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)
原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...
- HTML中的select下拉框内容显示不全的解决办法
HTML中的select下拉框内容显示不全的解决办法 今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了. 查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实 ...
- Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:
Windows Server 2008 R2中IIS7.5配置完网站权限不足问题的解决办法:常见问题:HTTP 错误 500.0 - Internal Server Error无法显示页面,因为发生内 ...
随机推荐
- 重现ssd遇到的问题
首先是create_list.sh和create_data.sh中的data_dir的路径得修改. 然后是在create_data.sh文件调用$caffe_root下的scripts目录中的crea ...
- HDU 4747 Mex ( 线段树好题 + 思路 )
参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...
- python中的re模块,常用函数介绍
参考: http://www.cnblogs.com/tina-python/p/5508402.htm ======== 1,预定义字符集,可以写在字符集[....]中 \d 数字: \D 非数字 ...
- 安卓context(一)
最近看了一下深入安卓内核,毫无安卓基础的我一头深入不可自拔,看的是云里雾里,第一遍看到一半左右似乎开始失去了效率. 现在开始第二遍,并对看过的重要知识点以个人的理解进行梳理(不免有错的地方,好心人请告 ...
- 实用JS系列——BOM常用对象
背景: 最近在着手项目的时候,意识到自己JS的欠缺.虽然看了不少JavaScript的视频,但真正项目中并不是经常遇到大且难的例子.所以JavaScript的基础还需要再打扎实,也就有了这一系列博客 ...
- 使用SecureCRT设置linux系统登录的ssh公钥认证
1.修改ssh配置文件/etc/ssh/sshd_configRSAAuthentication yes //使用RSA加密算法PubkeyAu ...
- 设计模式之单例模式与工厂模式的Python实现(一)
1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...
- MyBatis 基本演示
主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration P ...
- [洛谷P4320]道路相遇
题目大意:基本同上一题[bzoj5329][Sdoi2018]战略游戏,只是每个点集内只有两个点,且只有一组询问而已.(双倍经验?我反正就直接改了一下代码就交了) 题解:同上一题(链接见“题目大意”) ...
- BFC,IFC,GFC,FFC
FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用. ...