由于用户拥有的role权限在存储过程是不可用的。遇到这种情况,我们一般需要显示授权,如grant create table to user;但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程,实际上,oracle给我们提供了在存储过程中使用role权限的方法:修改存储过程,加入Authid Current_User时存储过程可以使用role权限。

下面以例子说明:

----执行存储过程p_create_emp2报下面的错误:
SQL> exec p_create_emp2; begin p_create_emp2; end; ORA-01031: 权限不足
ORA-06512: 在 "ECHO.P_CREATE_EMP2", line 12
ORA-06512: 在 line 2 ----查看p_create_emp2,该存储过程是要创建emp2表
create or replace procedure P_create_emp2 as
cursor t_cursor is
select * from user_tables where table_name = 'EMP2';
t_cur t_cursor%rowtype;
num int:=0;
begin
for t_cur in t_cursor loop
num:=num+1;
end loop;
if num=1 then
execute immediate 'drop table emp2 purge';
execute immediate 'create table emp2 as select * from emp';
else
execute immediate 'create table emp2 as select * from emp';
end if;
end P_create_emp2; ----查看echo用户的角色或权限
SQL> select * from dba_role_privs where grantee='ECHO'; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
ECHO DBA NO YES
----有dba的角色,说明建表的权限 ----修改存储过程p_create_emp2:
create or replace procedure P_create_emp2 authid current_user as
cursor t_cursor is
select * from user_tables where table_name = 'EMP2';
t_cur t_cursor%rowtype;
num int:=0;
begin
for t_cur in t_cursor loop
num:=num+1;
end loop;
if num=1 then
execute immediate 'drop table emp2 purge';
execute immediate 'create table emp2 as select * from emp';
else
execute immediate 'create table emp2 as select * from emp';
end if;
end P_create_emp2; ----再次执行:
SQL> exec p_create_emp2; PL/SQL procedure successfully completed SQL> desc emp2;
Name Type Nullable Default Comments
-------- ------------ -------- ------- --------
EMPNO NUMBER(4) Y
ENAME VARCHAR2(10) Y
JOB VARCHAR2(9) Y
MGR NUMBER(4) Y
HIREDATE DATE Y
SAL NUMBER(7,2) Y
COMM NUMBER(7,2) Y
DEPTNO NUMBER(2) Y ----在存储过程加了Authid Current_User选项,表创建成功。

Oracle:Authid Current_User使用的更多相关文章

  1. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  2. (转+整理) oracle authid definer 与 authid current_user

    转:http://blog.csdn.net/indexman/article/details/17067531 http://blog.csdn.net/liqfyiyi/article/detai ...

  3. Oracle:Authid Current_User的使用

    我们知道,用户拥有的role权限在存储过程是不可用的.遇到这种情况,我们一般需要显式授权,如grant create table to usera;但这种方法太麻烦,有时候可能需要进行非常多的授权才能 ...

  4. Oracle之AUTHID CURRENT_USER

    没有AUTHID CURRENT_USER表示定义者权限(definer rights),以定义者身份执行: 加上AUTHID CURRENT_USER表示调用者权限(invoker rights), ...

  5. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  6. 重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. Oracle 行转列(不固定行数的行转列,动态)(转)

    http://bbs.csdn.net/topics/330039676 SQLSERVER :行列转换例子:  http://www.cnblogs.com/gaizai/p/3753296.htm ...

  9. ORACLE 自动增长通过封装函数,方便调用

    好的编程习惯,是一个很有必要的过程.好的编程习惯,可以因人而异,但是简单地.基本地代码级别的就那些:写注释.合理的缩进.换行.变量命名等. 对我们程序员来说,大部分时间都对着电脑,在对着电脑的大部分时 ...

随机推荐

  1. 字符集WideCharToMultiByte

    GDAL C#封装对中文字符转换过程中存在问题. C++封装一个Win32 DLL,采用Unicode字符集.使用标准头文件. https://msdn.microsoft.com/en-us/lib ...

  2. Java学习——变量类型

    Java有3类变量 局部变量 成员变量(实例变量) 类变量(静态变量) 局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变 ...

  3. CPU boot up过程

    1.   CPU0 BOOT CPU1 BOOT 通过IPC互相通信 2.   CPU1 BOOT 完后,loop,等待IPC from CPU0 3.   cpu0 写IPC通知CPU1,cpu1 ...

  4. git提交

    1.git pull 本地已经commit 2.git checkout master 3.git pull 4.git checkout - 5.git merge master 6.git pus ...

  5. Android根据baidu Android定位SDK实现定位

    参考: http://www.open-open.com/lib/view/open1346982366162.html http://api.map.baidu.com/lbsapi/cloud/g ...

  6. C++Primer 第七章

    //1.定义在类内部的函数是隐式内联的. //2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针.对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰th ...

  7. PostgreSQL Insight Monitor pgstat

    PostgreSQL Insight Monitor  pgstat pgstat 是一个连接到数据库并获取数据库的活动状态的命令行工具. PostgreSQL有许多状态: archiver for ...

  8. 转:Tomcat配置

    一.修改Tomcat端口号步骤: 1.找到Tomcat目录下的conf文件夹 2.进入conf文件夹里面找到server.xml文件 3.打开server.xml文件 4.在server.xml文件里 ...

  9. c++ 中this底层

    成员变量设置在一个结构体中, 操作成员变量的成员函数,其实质上就是拥有一个隐藏的 成员变量结构体的地址指针,俗称this指针.

  10. Java里的File I/O

    Java的输入流主要由:InputStream和Reader作为基类,把持久化数据读入内存.输出流由OutputStream和Write类作为父类. 其中读如内存的时候,不可能一下去全读进去,需要一个 ...