2013年(350)
分类: Mysql/postgreSQL
2013-04-24 16:31:49
正如大家所知,Oracle从8i开始引入了调用者权限体系结构,之前一直使用定义者权限体系结构。关于定义者权限与调用者权限之间的相通点或者是各自优势本文不做探讨,这里仅描述调用者权限与定义者权限之间的差异,在我看来,主要有三个方面:
1、执行的schema不同,操作的对象也不同
l 在定义者(definer)权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指定的对象。
l 在调用者(invoker)权限下,执行的用户操作的schema为当前用户,所操作的对象是当前模式下的对象。
例如:
E:\ora10g>sqlplus "/ as sysdba"
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>create user tmpa identified by tmpa;
用户已创建。
SQL>grant connect,resource to tmpa;
授权成功。
SQL>create user tmpb identified by tmpb;
用户已创建。
SQL>grant connect,resource to tmpb;
授权成功。
SQL>conn tmpa/tmpa
已连接。
SQL>set sqlprompt TMPA>
TMPA>create table tmptbl(str varchar2(50));
表已创建。
TMPA>insert into tmptbl values ('I''m ownered by user:tmpa');
已创建 1 行。
TMPA>commit;
提交完成。
TMPA>create or replace procedure definer_proc as
2 begin
3 for x in (select sys_context('userenv', 'current_user') current_user,
4 sys_context('userenv', 'session_user') session_user,
5 sys_context('userenv', 'current_schema') current_schema,
6 str
7 from tmptbl) loop
8 dbms_output.put_line('Current User: ' || x.current_user);
9 dbms_output.put_line('Session User: ' || x.session_user);
10 dbms_output.put_line('Current Schema: ' || x.current_schema);
11 dbms_output.put_line('Tables Value: ' || x.str);
12 end loop;
13 end;
14 /
过程已创建。
TMPA>create or replace procedure invoker_proc AUTHID CURRENT_USER as
2 begin
3 for x in (select sys_context('userenv', 'current_user') current_user,
4 sys_context('userenv', 'session_user') session_user,
5 sys_context('userenv', 'current_schema') current_schema,
6 str
7 from tmptbl) loop
8 dbms_output.put_line('Current User: ' || x.current_user);
9 dbms_output.put_line('Session User: ' || x.session_user);
10 dbms_output.put_line('Current Schema: ' || x.current_schema);
11 dbms_output.put_line('Tables Value: ' || x.str);
12 end loop;
13 end;
14 /
过程已创建。
TMPA>set serveroutput on
TMPA>grant execute on definer_proc to tmpb;
授权成功。
TMPA>grant execute on invoker_proc to tmpb;
授权成功。
TMPA>exec definer_proc;
Current User: TMPA
Session User: TMPA
Current Schema: TMPA
Tables Value: I'm ownered by user:tmpa
PL/SQL 过程已成功完成。
TMPA>exec invoker_proc;
Current User: TMPA
Session User: TMPA
Current Schema: TMPA
Tables Value: I'm ownered by user:tmpa
PL/SQL 过程已成功完成。
可以看到,对于owner所拥有的对象,当前用户和session用户都是当前执行过程的用户;
新开一个连接,以tmpb用户登陆再执行看看:
E:\ora10g>sqlplus tmpb/tmpb
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> set sqlprompt TMPB>
TMPB>create table tmptbl(str varchar2(50));
表已创建。
TMPB>insert into tmptbl values ('I''m ownered by user:tmpb');
已创建 1 行。
TMPB>commit;
提交完成。
TMPB>set serveroutput on
TMPB>exec tmpa.definer_proc;
Current User: TMPA
Session User: TMPB
Current Schema: TMPA
Tables Value: I'm ownered by user:tmpa
PL/SQL 过程已成功完成。
TMPB>exec tmpa.invoker_proc;
Current User: TMPB
Session User: TMPB
Current Schema: TMPB
Tables Value: I'm ownered by user:tmpb
PL/SQL 过程已成功完成。
调用非owner的过程,对于定义者权限的过程,虽然session是tmpb,但当前用户仍然是tmpa,访问的对象也是tmpa的表,而对于调用者权限的过程,当前session和用户都是当前执行过程的用户tmpb,而且访问的对象也是当前用户的对象。