数据库系统入门 | Oracle 11g中执行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
--------------------
USER02USER02@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();
USER02Call completed.USER02@HUIYI>call pro_02();
USER02Call completed.-- USER01
USER01@HUIYI>select * from t;COL1
--------------------
USER01USER01@HUIYI>call user02.pro_01();
USER02Call completed.USER01@HUIYI>call user02.pro_02();
USER01Call completed.
【附:一文一图】
数据库系统入门 | Oracle 11g中执行Execute的时候报异常ORA-01031的解决办法相关推荐
- 服务器执行sh文件或目录,将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法...
出现bad interpreter:No such file or directory的原因,是文件格式的问题.这个文件是在Windows下编写的.换行的方式与Unix不一样,但是在vim下面如果不S ...
- Toad for Oracle 导入MIP.dmp文件时:报内存不足时的解决办法:
摘要:最近在使用Oracle数据库开发项目,其中在用Toad for Oracle连接操作Oracle11g的时候出现了问题,问题是这样的:在数据库管理员的连接下导入已经建立的用户的dmp文件,会报内 ...
- bak文件转oracle文件,如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g)...
如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g) 我有Oracle 11g备份文件(.bak文件)如何在Oracle 11g ...
- ORACLE 11G中的ADR介绍:
直到今天,我才开始接触oracle 11g,先了解其新特性,以下这些是我的新特性读书笔记: 第一部分:(Automatic Diagnostic Repository)ADR 在oracle 11g中 ...
- Oracle 11g中的IO Calibrate(IO校准)--Automatic Degree of Parallelism(DOP)
Oracle 11g中的IO Calibrate(IO校准)--Automatic Degree of Parallelism(DOP) Oracle 11g中的IO Calibrate(IO校准) ...
- oracle 11g中的自动维护任务管理
因为人员紧缺,最近又忙着去搞性能优化的事情,有时候真的是不想再搞这个事情,只是没办法,我当前的绩效几乎取决于这个项目的最终成绩,所以不管是人的事还是事的事,都得去让他顺利推进. 前段时间发生还有几台服 ...
- Oracle 11g中的IO Calibrate(IO校准)
Oracle 11g中的IO Calibrate(IO校准).sql Oracle数据库发展到今天,"IO为王"已经是一种发展方向趋势.ExtraData一体机的重要特色之一就是最 ...
- oracle永久解scott,Oracle 11g中解决被锁定的scott用户的方法
Oracle 11g中修改被锁定的用户:scott,在安装完Oracle10g和创建完oracle数据库之后,想用数据库自带的用户scott登录,看看连接是 Oracle 11g中修改被锁定的用户:s ...
- 盘点 Oracle 11g 中新特性带来的10大性能影响
盘点 Oracle 11g 中新特性带来的10大性能影响 原创 2017-08-02 盖国强 数据和云 Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先 ...
最新文章
- 【济宁百瑞达机械设备有限公司——文化拓展学习】2018技术展望:利用现有IT投资扩大云部署...
- 「C++」C++ Primer Plus 笔记:第一章 预备知识
- LeetCode Algorithm 746. 使用最小花费爬楼梯
- 什么电脑的牌子好用_扬州诚招电动牙刷代理有什么牌子比较好用
- PWN-PRACTICE-BUUCTF-3
- 安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...
- springboot+flowable第三节(动态设置审批人)
- [PHP] - 逗号和点号的区别
- 与 Brian Kernighan 一起回忆 Unix 的诞生!
- Bailian3470 整理扑克牌【贪心+二分】
- Code Chef - Chef and Graph Queries
- 浅谈TCP/IP协议中TCP与UDP的区别
- 经典五子棋游戏项目需求文档【软件工程课程作业】
- 一维最大熵阈值分割法原理及实现
- VSU(虚拟交换单元)组网提升网络可用性
- Android 最新所有框架
- 系统等保指的是信息系统的安全保护等级
- 典型的DOS攻击技术
- 如何制定 - 测试计划和策略 (详细讲解)
- 将MindManager添加到鼠标右键新建项