Authid Current_User 是调用者权限。
oracle DB下面有2种执行的权限:定义者权限和调用者权限。
默认都是定义者权限。声明Authid Current_User后就是调用者权限。定义者权限的现象是,如果在APPS下创建的procedure,那其他user,只要能执行procedure,都是以apps的名义来执行的。因为APPS是procedure的定义者。
APPS能做什么,那这个procedure就能做什么。调用者权限的现象是,如果在APPS下创建的procedure,如果其他user有权限执行这个procedure,这个procedure所做的内容都是以当前user的名义来做的。如果某个table,只有APPS才有权限修改,那这个procedure在apps下面才执行成功。其他user下是不成功的。
我在一些技术论坛里面,常常看到有朋友问这种问题: 为什么我的用户具有DBA权限,却无法在存储过程里面创建一张普通表呢?
下面就结合具体案例来谈谈这个问题:
SQL> conn eric/eric; Connected.
SQL> select * from dba_role_privs where grantee='ERIC'; GRANTEE                        GRANTED_ROLE                   ADM DEF ------------------------------ ------------------------------ --- --- ERIC                           DBA                            NO  YES ERIC                           CONNECT                        NO  YES ERIC                           RESOURCE                       NO  YES ERIC                           RECOVERY_CATALOG_OWNER         NO  YES
可以看到,用户eric拥有 DBA 权限!
用此用户创建一个存储过程:
create or replace procedure p_CreateTable  as begin execute immediate 'create table test_tb(id number)'; end p_CreateTable; /
Procedure created.
运行时会发现,系统提示权限不足(insufficient privileges)!
SQL> exec p_CreateTable; BEGIN p_CreateTable; END; * ERROR at line 1: ORA-01031: insufficient privileges ORA-06512: at "ERIC.P_CREATETABLE", line 3 ORA-06512: at line 1
由上可以看到,即使拥有DBA role,也不能创建表。
即 role在存储过程中不可见!
查阅资料发现:
Oracle8i以前的版本,所有已编译存储对象,包括packages, procedures, functions, triggers, views等,只能以定义者(Definer)身份解析运行;
而Oracle8i及其后的新版本,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。
遇到这种情况,通常解决方法是进行显式的系统权限: grant create table to eric;
但是,此方法太笨,因为有可能执行一个存储过程,需要很多不同权限(oracle对权限划分粒度越来越细)。
最好的方法是,利用 oracle 提供的方法,在创建存储过程时,加入 Authid Current_User 条件进行权限分配。
 
create or replace procedure p_CreateTable Authid Current_User  as  begin execute immediate 'create table test_tb(id number)'; end p_CreateTable; /
Procedure created.
SQL> exec p_CreateTable; PL/SQL procedure successfully completed.
SQL> desc test_tb Name                                      Null?    Type ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER
成功啦!!!
由此可以引申出一个问题:
如果用户B要执行A用户的某存储过程,传统的解决方案是:
A用户将此存储过程的执行权限赋予B用户: grant execute on p_test to B;
在B用户下创建一个同义词: create synonym p_test for a.p_test;
然后B用户就可以直接执行p_test了.
但是,如果使用 Authid Current_User 选项,在创建时给调用者授权,就简单多了!
												

使用 Authid Current_User 为调用者授权相关推荐

  1. Oracle之AUTHID CURRENT_USER

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

  2. Authid current_user的用法

    Authid Current_User:以执行过程的用户的权限来处理涉及的对象权限. 这是典型的,数据库中只创建一个存储过程,所有用户都可以使用,但是每个用户使用的时候 只是用自己的权限权限执行,or ...

  3. Oracle:Authid Current_User使用

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

  4. Oracle-PROCEDURE权限解读

    问题 存过中有查询dba_相关的数据字典视图,编译时却提示 '表或视图不存在',编译不通过. 但是报错的语句在SQL中确实可以查到的,说明问题并不是提出给出的'表或视图不存在'导致的. 这里需要注意S ...

  5. 奇怪的ORA-00942:表或视图不存在

    一. 背景 用户在数据库执行语句时遇到一个奇怪的报错,这个sql执行一共会返回500多万行数据,但每返回到400多万行时就报错ORA-00942:表或视图不存在(sql中所用表和包已授权) 此处省略报 ...

  6. plsql动态的sql

    12 动态SQL语句和动态PLSQL语句 SQL语句 --  静态的SQL语句.动态的SQL语句 静态的SQL语句  --  在编译的时候已经确定的SQL,语法和语义引用也是在编译的时候确定下来的   ...

  7. Oracle PL/SQL进阶编程(第十五弹:动态SQL语句)

    理解动态SQL语句 动态SQL语句基础 动态SQL语句不仅是指SQL语句是动态拼接而成的,更主要的是SQL语句所使用的对象也是运行时期才创建的.出现这种功能跟PL/SQL本身的早起绑定特性有关,早PL ...

  8. 使用调用者权限实现Schema导向操作

    很多时候,我们都会使用存储过程Procedure来实现一些脚本工具.通过Procedure来实现一些数据库相关的维护.开发工作,可以大大提高我们日常工作效率.一个朋友最近咨询了关于Procedure调 ...

  9. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

最新文章

  1. 憋个大招!4年小Java的心路历程
  2. 转:C++中const、volatile、mutable的用法
  3. 印象笔记mac版 同步问题_印象笔记表示 今年将大幅提升产品体验
  4. Oracle 基础篇 --- 索引选项
  5. mysql 表名是变量_MySQL深层次的总结
  6. dn什么意思_给排水DN与dn分别是什么
  7. android怎么实现推送消息推送消息,Android实现系统消息推送
  8. 什么是外包公司?要不要去外包公司?
  9. 基于android的影音设计,基于Android的车载影音导航系统软件设计与实现
  10. 第05篇:Mybatis的SQL执行流程分析
  11. Python总结-学习方向和方法
  12. FPGA零基础学习:数字通信中的电压标准
  13. css 隐藏滚动条 但是可以滚动
  14. 标签ul与ol的区别及使用方法
  15. mysql 中abs函数_Mysql常用函数
  16. 键盘起源于那一带计算机,键盘排序的由来竟是因为这个原因……
  17. 微信小程序表单字符串转数组
  18. 【论文笔记】—低照度图像增强—ZeroShot—RRDNet网络—2020-ICME
  19. 高级UI设计必备三个意识
  20. 修改Realtek瑞昱网卡硬件MAC地址突破路由器上网Mac地址绑定

热门文章

  1. reportviewer控件mysql_reportviewer控件下载
  2. Tensorflow保存模型,恢复模型
  3. leetcode-11-盛最多水的容器
  4. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
  5. Action Service Dao三层的功能划分
  6. 阿里巴巴产品实习生N天
  7. 相似图片搜索的原理(转)
  8. ArcGIS Desktop开发基础(转)
  9. Android 内容提供器---内容提供器基础(内容的统一资源标识(URIs))
  10. 快手文档 - www.kuaishou.net