(转+整理) oracle authid definer 与 authid current_user
转:http://blog.csdn.net/indexman/article/details/17067531
http://blog.csdn.net/liqfyiyi/article/details/7441706
oracle DB下面有2种执行的权限:定义者权限(Definer)和调用者权限(Invoker)。
- AUTHID DEFINER (定义者权限):指编译存储对象的所有者。也是默认权限模式。
 
  定义者权限的现象是,如果在APPS下创建的procedure,那其他user,只要能执行procedure,都是以apps的名义来执行的。因为APPS是procedure的定义者。
APPS能做什么,那这个procedure就能做什么。
- AUTHID CURRENT_USER(调用者权限):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema)
 
调用者权限的现象是,如果在APPS下创建的procedure,如果其他user有权限执行这个procedure,这个procedure所做的内容都是以当前user的名义来做的。如果某个table,只有APPS才有权限修改,那这个procedure在apps下面才执行成功。其他user下是不成功的。
官方的解释:
By default, stored procedures and SQL methods execute with the privileges of their owner, not their current user. Suchdefiner's rights subprograms are bound to the schema in which they reside, allowing you to refer to objects in the same schema without qualifying their names. For example, if schemas HR and OEboth have a table called departments, a procedure owned by HR can refer to departments rather than HR.departments. If user OE calls HR's procedure, the procedure still accesses the departments table owned by HR.
A more maintainable way is to use the AUTHID clause, which makes stored procedures and SQL methods execute with the privileges and schema context of the calling user. You can create one instance of the procedure, and many users can call it to access their own data.
默认情况,程序以其拥有者身份(定义者)执行。定义者权限的程序与其所在模式绑定,调用对象不需要加上模式完整名称。例如,假如模式HR和OE都有deparments表,HR拥有的程序可直接调用departments而不用HR.departments.而如果OE调用HR的程序,程序仍然调用的是HR的departments.
如果希望不同模式(schema)调用相同的程序却可以操作各自拥有的对象,就可以在定义程序的时候加上AUTHID CURRENT_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 选项,在创建时给调用者授权,就简单多了!
(转+整理) oracle authid definer 与 authid current_user的更多相关文章
- 整理oracle 树形查询
		
注:本文参考了<整理oracle 树形查询> sql树形递归查询是数据库查询的一种特殊情形,也是组织结构.行政区划查询的一种最常用的的情形之一.下面对该种查询进行一些总结: create ...
 - 整理ORACLE数据库备份常用术语
		
本文将讲述在备份是常用的数据库相关术语以及业界定义的专业术语,供大家参考和学习. 数据库相关术语: (1)冷备份: 冷备份是将数据库关闭之后,将数据文件.联机日志文件.控制文件拷贝到其他地方进行备份. ...
 - [整理]Oracle LOCK 机制
		
数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.锁机制用于管理对 ...
 - 总结:整理 oracle异常错误处理 .
		
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
 - Oracle数据库案例整理-Oracle系统执行时故障-Shared Pool内存不足导致数据库响应缓慢
		
1.1 现象描写叙述 数据库节点响应缓慢,部分用户业务受到影响. 查看数据库告警日志,開始显示ORA-07445错误,然后是大量的ORA-04031错误和ORA-00600错误. 检查数据 ...
 - 整理 oracle异常错误处理
		
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
 - Oracle数据库案例整理-Oracle系统执行失败-sql_trace至TRUE导致Oracle在根文件夹中缺乏可用空间
		
1.1 述 在"$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace"文件夹下产生大量"oracle_w ...
 - Oracle数据库案例整理-Oracle系统执行时故障-断电导致数据文件状态变为RECOVER
		
1.1 现象描写叙述异常断电.数据库数据文件的状态由ONLINE变为RECOVER. 系统显演示样例如以下信息:SQL>selectfile_name,tablespace_name, ...
 - java知识随笔整理-Oracle存储过程优缺点
		
优点: 1.存储过程可以使得程序执行效率更高.安全性更好. 2.建立过程不会很耗系统资源,因为过程只是在调用才执行. 3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量 ...
 
随机推荐
- 利用逻辑运算符?"三个数字比大小
			
static void Main(string[] args) { int a, b, c; while (true) ...
 - Java Socket 异常 Connection reset
			
最近使用Java做Socket客户端,与C的Socket服务端交互.遇到问题:现象是可以从服务端接受小数据,但是如果接受大数据,总是遇到Connection reset的异常:如果把服务端和客户端放到 ...
 - NEsper使用的事件类型 z
			
NEsper使用的事件类型来描述事件的类型信息.你的应用在启动时可能预先配置定义事件类型,或者在运行时通过API或EPL语法动态的增加事件类型. EPL中的create schema 的语法允许在运行 ...
 - Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例
			
原文地址:http://www.jb51.net/article/31844.htm Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 ...
 - 利用 jQuery-photoClip插件 实现移动端裁剪功能并以Blob对象上传
			
最近客户要求实现论坛贴子附件裁剪功能,没有考虑js与ios.android容器交互解决方案,单纯用js去实现它的.由于本来附件上传用的别的插件实现的,所以是在此基础上费了不少劲,才把jQuery-ph ...
 - [codevs3862]竞赛班的垃圾处理
			
题目描述 Description 竞赛班的师弟们都很懒,每个人都不喜欢倒垃圾,结果垃圾就会跟师兄的RP一样越堆越多,当然,老师时不时就会叫他们去倒垃圾.由于他们真的很懒,他们只会直接将垃圾桶最上面袋拿 ...
 - NOIP2015 子串 (DP+优化)
			
子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...
 - 关于Windows Azure的常见问题-执行与维护FAQ
			
执行与维护 使用虚拟机运行业务应用有什么需要注意的地方? Windows Azure 会周期性地更新主机环境,以确保平台上运行的所有应用程序和虚拟机始终处于安全的环境.此更新过程可能会导致您的虚拟机重 ...
 - [Locked] Range Sum Query 2D - Mutable
			
Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...
 - PHP留言板(实例)
			
lyb.htm <div class="lymain"> <script language="JavaScript"> function ...