eygle.com   eygle.com
eygle.com  
 

« The Waiting Life | Blog首页 | How to maintain Oracle10g Recyclebin? »

Definer and Invoker Rights

作者:eygle |【转载时请以超链接形式标明文章和作者信息及本声明
链接:

本文用以回答留言板上的2111号问题.

在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.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production
SQL> create or replace procedure definer_proc
  2  as
  3  begin
  4      for x in
  5      ( select sys_context( 'userenv', 'current_user' ) current_user,
  6               sys_context( 'userenv', 'session_user' ) session_user,
  7               sys_context( 'userenv', 'current_schema' ) current_schema
  8          from dual )
  9      loop
 10          dbms_output.put_line( 'Current User:   ' || x.current_user );
 11          dbms_output.put_line( 'Session User:   ' || x.session_user );
 12          dbms_output.put_line( 'Current Schema: ' || x.current_schema );
 13      end loop;
 14  end;
 15  /
Procedure created.
SQL> 
SQL> grant execute on definer_proc to test;
Grant succeeded.
SQL> 
SQL> create or replace procedure invoker_proc
  2  AUTHID CURRENT_USER
  3  as
  4  begin
  5      for x in
  6      ( select sys_context( 'userenv', 'current_user' ) current_user,
  7               sys_context( 'userenv', 'session_user' ) session_user,
  8               sys_context( 'userenv', 'current_schema' ) current_schema
  9          from dual )
 10      loop
 11          dbms_output.put_line( 'Current User:   ' || x.current_user );
 12          dbms_output.put_line( 'Session User:   ' || x.session_user );
 13          dbms_output.put_line( 'Current Schema: ' || x.current_schema );
 14      end loop;
 15  end;
 16  /
Procedure created.
SQL> 
SQL> grant execute on invoker_proc to test;
Grant succeeded.

注意invoker权限的本质是引入了AUTHID CURRENT_USER子句,通过此句Oracle得以使用invoker身份编译执行对象。

2.以test用户(invoker)身份执行

SQL> connect test/test
Connected.
SQL>
SQL> set serveroutput on
SQL> exec eygle.definer_proc
Current User:   EYGLE
Session User:   TEST
Current Schema: EYGLE
PL/SQL procedure successfully completed.
SQL> exec eygle.invoker_proc
Current User:   TEST
Session User:   TEST
Current Schema: TEST
PL/SQL procedure successfully completed.

注意只有使用invoker者权限执行时,Schema才转换为TEST.

SQL> alter session set current_schema = system;
Session altered.
SQL> exec eygle.definer_proc
Current User:   EYGLE
Session User:   TEST
Current Schema: EYGLE
PL/SQL procedure successfully completed.
SQL> exec eygle.invoker_proc
Current User:   TEST
Session User:   TEST
Current Schema: SYSTEM
PL/SQL procedure successfully completed.
SQL> 
通过alter session set current_schema方式修改当前模式之后,我们看到仍然是仅当使用invoker权限执行时,Schmea方切换为SYSTEM.

历史上的今天...
      >> 2008-12-12文章:
      >> 2006-12-12文章:
             使用Perl连接Mysql数据库
      >> 2004-12-12文章:
------
这篇 【Definer and Invoker Rights】来自 eygle.com | CSDN网摘| del.icio.us|Google订阅 | 鲜果订阅 | 抓虾订阅

By eygle on 2005-12-12 12:08 | Comments (3) | Posted to SQL.PLSQL | Edit |

相关文章 随机文章
  • 10g临时表空间组导致递归SQL高度解析案例
  • Oracle的SQL可以有多长?
  • 如何对时间进行简单加减运算
  • 并行查询并行度Degree与instances 设置
  • 关于PARALLEL_MAX_SERVERS参数的设置
  • DBA警世录:Oracle的共享内存段
    How to simulate block corruption with BBED?
    天下无贼-那一滴金砂的缘起缘落
    两只蝴蝶
    终于解决了MSN - Live Messenger 性能问题
    搜索本站:

    留言 (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

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004~2010 eygle.com, All rights reserved.