问题描述

在做实验的时候,编写关于 “在存储过程中使用动态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的解决办法相关推荐

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

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

  2. Toad for Oracle 导入MIP.dmp文件时:报内存不足时的解决办法:

    摘要:最近在使用Oracle数据库开发项目,其中在用Toad for Oracle连接操作Oracle11g的时候出现了问题,问题是这样的:在数据库管理员的连接下导入已经建立的用户的dmp文件,会报内 ...

  3. 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 ...

  4. ORACLE 11G中的ADR介绍:

    直到今天,我才开始接触oracle 11g,先了解其新特性,以下这些是我的新特性读书笔记: 第一部分:(Automatic Diagnostic Repository)ADR 在oracle 11g中 ...

  5. 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校准) ...

  6. oracle 11g中的自动维护任务管理

    因为人员紧缺,最近又忙着去搞性能优化的事情,有时候真的是不想再搞这个事情,只是没办法,我当前的绩效几乎取决于这个项目的最终成绩,所以不管是人的事还是事的事,都得去让他顺利推进. 前段时间发生还有几台服 ...

  7. Oracle 11g中的IO Calibrate(IO校准)

    Oracle 11g中的IO Calibrate(IO校准).sql Oracle数据库发展到今天,"IO为王"已经是一种发展方向趋势.ExtraData一体机的重要特色之一就是最 ...

  8. oracle永久解scott,Oracle 11g中解决被锁定的scott用户的方法

    Oracle 11g中修改被锁定的用户:scott,在安装完Oracle10g和创建完oracle数据库之后,想用数据库自带的用户scott登录,看看连接是 Oracle 11g中修改被锁定的用户:s ...

  9. 盘点 Oracle 11g 中新特性带来的10大性能影响

    盘点 Oracle 11g 中新特性带来的10大性能影响 原创 2017-08-02 盖国强 数据和云 Oracle的任何一个新版本,总是会带来大量引人瞩目的新特性,但是往往在这些新特性引入之初,首先 ...

最新文章

  1. 【济宁百瑞达机械设备有限公司——文化拓展学习】2018技术展望:利用现有IT投资扩大云部署...
  2. 「C++」C++ Primer Plus 笔记:第一章 预备知识
  3. LeetCode Algorithm 746. 使用最小花费爬楼梯
  4. 什么电脑的牌子好用_扬州诚招电动牙刷代理有什么牌子比较好用
  5. PWN-PRACTICE-BUUCTF-3
  6. 安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...
  7. springboot+flowable第三节(动态设置审批人)
  8. [PHP] - 逗号和点号的区别
  9. 与 Brian Kernighan 一起回忆 Unix 的诞生!
  10. Bailian3470 整理扑克牌【贪心+二分】
  11. Code Chef - Chef and Graph Queries
  12. 浅谈TCP/IP协议中TCP与UDP的区别
  13. 经典五子棋游戏项目需求文档【软件工程课程作业】
  14. 一维最大熵阈值分割法原理及实现
  15. VSU(虚拟交换单元)组网提升网络可用性
  16. Android 最新所有框架
  17. 系统等保指的是信息系统的安全保护等级
  18. 典型的DOS攻击技术
  19. 如何制定 - 测试计划和策略 (详细讲解)
  20. 将MindManager添加到鼠标右键新建项

热门文章

  1. win10提示无法在驱动器0分区上安装windows解决方法
  2. Swift - Any 和 AnyObject
  3. DFT - 对芯片测试的理解(二) 详解
  4. oracle培训教材
  5. 教你搭建一个花卉识别系统(超级简单)
  6. IP V4地址最后一位斜杠是什么意思?
  7. Win10进不去,卡在欢迎界面
  8. 根据情况将近500家物流企业海口
  9. C#窗体全屏隐藏任务栏
  10. 数据库(增删改查、mysql建课程表)