使用调用者权限实现Schema导向操作
作者:网络转载 发布时间:[ 2014/11/27 15:30:32 ] 推荐标签:数据库 项目开发
从Schema A进行调用动作:
SQL> exec proc('iii');
PL/SQL procedure successfully completed
SQL> select * from a;
COL
----------------------------------------
Iii
SQL> grant execute on proc to b;
Grant succeeded
另外创建Schema B数据表对象,并且包括同义词对象。
SQL> conn b/b@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as b
SQL> create table a(col varchar2(10));
Table created
SQL> create synonym proc for a.proc;
Synonym created
进行默认情况测试,在Schema B中调用存储过程proc,看操作数据表是哪张:
SQL> conn b/b@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as b
SQL> exec proc('JJJ');
PL/SQL procedure successfully completed
SQL> select * from a;
COL
----------------------------------------
Schema B中数据表a没有数据,查看Schema A中数据表情况:
SQL> select * from a.a;
COL
--------------------
JJJ
Iii
实验说明:在默认情况下,不同Schema对象调用相同存储过程,其中涉及到的对象都是相同的。也是Oracle存储过程中的“所有者权限”。一旦用户拥有执行存储过程的权限,意味着在执行体中,使用的是执行体所有者的权限体系。
那么这个问题似乎是没有办法。执行体指向的是Schema A的数据表a。
3、测试实验二
与所有者权限对应的另一种模式是“调用者权限”。也说,对用户是否可以执行该程序体中的对象,完全取决于执行调用用户系统权限和对象权限(注意:非角色权限)。
笔者一种猜想,如果应用调用者权限,从执行用户权限角度看,是不是可以直接访问自己Schema中的对象了。下面通过实验进行证明。
SQL> conn a/a@sicsdb
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as a
SQL>
SQL> create or replace procedure Proc(i_vc_name varchar2) AUTHID CURRENT_USER is
2 begin
3 insert into a values (i_vc_name);
4 commit;
5 end Proc;
6 /
Procedure created

sales@spasvo.com