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