如何在Oracle存储过程中拥有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> exec p_create_table;
  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


已经可以执行了。

时间: 2024-12-06 05:51:42

如何在Oracle存储过程中拥有role权限的相关文章

如何在Oracle存储过程中调用Java方法

存储过程中调用Java程序段 软件环境: 1.操作系统:Windows 2000 Server 2.数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版 3.安装路径:C:\ORACLE 实现方法: 1.创建一个文件为Test.java public class Test { public static void main(String args[]) { System.out.println("HELLO THIS iS A Java PROCEDURE"):

如何在oracle存储过程中进行简单动态查询

在存储过程中做简单动态查询代码 ,例如: CREATE OR REPLACE procedure ZXM_SB_GZ_GET (p_table in varchar2, p_name in varchar2, p_value in varchar2, outpara out lntxdba.zxm_pag_cs_power.c_type ) as begin declare wherevalue varchar2(200): begin wherevalue:=select * from ||p

如何在Oracle存储过程中实现分页

几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案. 之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,只需要修改存储过程的代码.但这个例子是在存储过程里动态生成的SQL语句,不知道会不会因此失去存储过程一次编译和快速的特点.代码如下: 1.首先建立一个包,用户创建一个游标类型 create or replace package pkg_query as type cu

ORACLE 存储过程中的Authid Current_User

ORACLE用户具有DBA权限,却会出现无法在存储过程里面创建一张普通表的现象.因为即使用户拥有DBA权限,用户拥有的role权限在存储过程是不可用的. 遇到这种情况,通常解决方法是进行显式的权限分配: grant create table to user a;但这种方法太麻烦,因为有可能执行一个存储过程,需要很多不同权限.实际上,oracle给我们提供了在存储过程中使用role权限的方法:修改存储过程,加入Authid Current_User进行权限分配. 在ORACLE8i以前的版本,所有

如何在oracle 11g 中导出空表

  如何在oracle 11g 中导出空表 由于oracle 11g的 延迟段创建的新特性,导致在没有数据插入时,oracle是不会分配数据段的,进而导致exp 是不能导出11g数据库的空表的. 当然采用expdp就不存在这个问题了. expdp hr/hr schemas=hr dumpfile=expdp.dmp directory=dbtest conn hr/hr select TABLE_NAME,NUM_ROWS from user_tables; TABLE_NAME NUM_RO

Oracle存储过程中如何调用dll

问题描述 想在oracle存储过程中调用c#.net编写的一个dll:该DLL返回一个dataTable,在存储过程中操作dataTable,请问可以实现么?现在怎么用oracle调用dll都不会,请大家指点一二!谢谢!

Oracle存储过程中的角色

角色(数据库权限集)与存储过程.函数和数据包之间的交互方式是Oracle安全模型中最难以处理的一个部分.Oracle中的对象权限可以直接或通过角色间接授予用户. 假设一个HR用户向用户ABEL授予EMPLOYEES表的一些许可: GRANT select, insert, update, delete 这个语句直接把上述四个权限授予给用户ABEL.另一方面,假设一名HR用户这样做: GRANT select, insert, update, delete ON employees TO hr_r

Oracle存储过程中任务和管道的应用

1. 前言 在Oracle数据库实际应用过程中,经常把业务处理逻辑的放在存储过程,客户端通过ADO进行调用.有些业务逻辑处理量大并且复杂,使客户端调用存储过程后,长时间没有反应,也不知存储过程运行状态,本文讲述如何在Oracle通过任务和管道的应用,异步调用存储过程的方法. 2. 基本原理 1.使用DBMS_JOB包将主处理存储过程作为任务提交到任务队列中: 2.主处理存储过程在运行过程中通过DBMS_PIPE包将处理情况放在管道中: 3.监控存储过程读取管道,从而了解处理情况: 4.本文没有描

oracle存储过程中的select与参数详细说明

  create or replace procedure pro_test is begin select * from t_test; end pro_test; 这个存储过程正确吗? 昨天因为这个,耽误了好久(在一个存储过程中用了select语句,但既没有用游标也没有用into). 在存储过程(oracle数据库教程)中如果用了select语句,要么使用"select into 变量"语句要么使用游标,oracle不支持单独的select语句(如表述有误请指出). select