« The Waiting Life | Blog首页 | How to maintain Oracle10g Recyclebin? »
Definer and Invoker Rights
作者:eygle |【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】链接:http://www.eygle.com/archives/2005/12/definer_and_invoker_rights.html
在Oracle8i以前,所有已编译存储对象(包括packages, procedures, functions, triggers, and views)只能以定义者(Definer)身份解析运行;从Oracle8i开始,Oracle引入调用者(invoker)权限,使得对象可以以调用者身份和权限执行。
定义者(Definer)指编译存储对象的所有者.
调用者(Invoker)指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema).
TOM在他的《Expert One on One》的第23章曾经详细介绍这一特性,本文引用Tom的一个例子用于说明Definer and Invoker权限。
1.以Eygle用户(definer)创建2个过程
$ sqlplus eygle/eygle SQL*Plus: Release 9.2.0.4.0 - Production on Sun Dec 11 11:39:27 2005 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> create or replace procedure definer_proc Procedure created. SQL> Grant succeeded. SQL> Procedure created. SQL> Grant succeeded. |
注意invoker权限的本质是引入了AUTHID CURRENT_USER子句,通过此句Oracle得以使用invoker身份编译执行对象。
2.以test用户(invoker)身份执行
SQL> connect test/test PL/SQL procedure successfully completed. SQL> exec eygle.invoker_proc PL/SQL procedure successfully completed. |
注意只有使用invoker者权限执行时,Schema才转换为TEST.
SQL> alter session set current_schema = system; Session altered. SQL> exec eygle.definer_proc PL/SQL procedure successfully completed. SQL> exec eygle.invoker_proc PL/SQL procedure successfully completed. SQL> |
-----
这篇 【Definer and Invoker Rights】来自 www.eygle.com | CSDN技术网摘| del.icio.us|365Key
By eygle on 2005-12-12 12:08 | Comments (3) | Posted to SQL.PLSQL | Edit |Pageviews:
留言 (3)
謝謝...
不過對你所說的
"通过alter session set current_schema方式修改当前模式之后,我们看到仍然是仅当使用invoker权限执行时,Schmea方切换为SYSTEM."這句話還是有疑問,不知道能否在文檔區發表異意..呵...
Posted by: zyong at December 12, 2005 2:00 PM
謝謝...
不過對你所說的
"通过alter session set current_schema方式修改当前模式之后,我们看到仍然是仅当使用invoker权限执行时,Schmea方切换为SYSTEM."這句話還是有疑問,不知道能否在文檔區發表異意..呵...
Posted by: zyong at December 12, 2005 2:00 PM
哪里有疑问?结果不是很明显么?
Posted by: eygle at December 12, 2005 2:10 PM
