使用调用者权限实现Schema导向操作

很多时候,我们都会使用存储过程Procedure来实现一些脚本工具。通过Procedure来实现一些数据库相关的维护、开发工作,可以大大提高我们日常工作效率。一个朋友最近咨询了关于Procedure调用的问题,觉得比较有意思,记录下来供需要的朋友不时之需。

  1、问题描述

  问题背景是这样,朋友在运维一个开发项目,同一个数据库中多个Schema内容相同,用于不同的测试目的。一些开发同步任务促使编写一个程序来实现Schema内部或者之间对象操作。从软件版本角度看,维护一份工具脚本是最好的方法,可以避免由于修改造成的版本错乱现象。如何实现一份存储过程脚本,在不同Schema下执行效果不同就成为问题。

  将问题简化为如下描述:在Schema A里面包括一个存储过程Proc,A中还有一个数据表T1。在Proc代码中,包括了对T1的操作内容。而Schema B中也存在一个数据表T1,并且B拥有一个名为Proc的私有同义词synonym指向A.Proc。问题是如何让Proc根据执行的Schema主体不同,访问不同Schema的数据表。

  也就是说,如果是A调用Proc程序包,操作的就是A Schema里面的数据表T1。如果B调用Proc程序包,就操作B Schema里面的数据表T1。

  2、测试实验一

  为了验证测试,我们模拟了实验环境,来观察现象。选择11gR2进行测试。


SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE      11.2.0.4.0     Production

TNS for 64-bit Windows: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

创建对应Schema和数据表。

SQL> create user a identified by a;

User created

SQL> create user b identified by b;

User created

SQL> grant connect, resource to a,b;

Grant succeeded

SQL> grant create procedure to a,b;

Grant succeeded

SQL> grant create synonym to a,b;

Grant succeeded

  在Schema A下面创建数据表和对应操作存储过程。


SQL> conn a/a@sicsdb

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

Connected as a

SQL> create table a(col varchar2(10));

Table created

SQL> create or replace procedure Proc(i_vc_name varchar2) is

2  begin

3    insert into a values (i_vc_name);

4    commit;

5  end Proc;

6  /

Procedure created

从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

很多时候,我们都会使用存储过程Procedure来实现一些脚本工具。通过Procedure来实现一些数据库相关的维护、开发工作,可以大大提高我们日常工作效率。一个朋友最近咨询了关于Procedure调用的问题,觉得比较有意思,记录下来供需要的朋友不时之需。

  1、问题描述

  问题背景是这样,朋友在运维一个开发项目,同一个数据库中多个Schema内容相同,用于不同的测试目的。一些开发同步任务促使编写一个程序来实现Schema内部或者之间对象操作。从软件版本角度看,维护一份工具脚本是最好的方法,可以避免由于修改造成的版本错乱现象。如何实现一份存储过程脚本,在不同Schema下执行效果不同就成为问题。

  将问题简化为如下描述:在Schema A里面包括一个存储过程Proc,A中还有一个数据表T1。在Proc代码中,包括了对T1的操作内容。而Schema B中也存在一个数据表T1,并且B拥有一个名为Proc的私有同义词synonym指向A.Proc。问题是如何让Proc根据执行的Schema主体不同,访问不同Schema的数据表。

  也就是说,如果是A调用Proc程序包,操作的就是A Schema里面的数据表T1。如果B调用Proc程序包,就操作B Schema里面的数据表T1。

  2、测试实验一

  为了验证测试,我们模拟了实验环境,来观察现象。选择11gR2进行测试。


SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE      11.2.0.4.0     Production

TNS for 64-bit Windows: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

创建对应Schema和数据表。

SQL> create user a identified by a;

User created

SQL> create user b identified by b;

User created

SQL> grant connect, resource to a,b;

Grant succeeded

SQL> grant create procedure to a,b;

Grant succeeded

SQL> grant create synonym to a,b;

Grant succeeded

  在Schema A下面创建数据表和对应操作存储过程。


SQL> conn a/a@sicsdb

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0

Connected as a

SQL> create table a(col varchar2(10));

Table created

SQL> create or replace procedure Proc(i_vc_name varchar2) is

2  begin

3    insert into a values (i_vc_name);

4    commit;

5  end Proc;

6  /

Procedure created

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-02 10:40:38

使用调用者权限实现Schema导向操作的相关文章

PL/SQL专家指南3——调用者权限和定义者权限 上篇

1.介绍定义者(definer)权限和调用者(invoker)权限的概念 定义者权限:定义者权限PL/SQL程序单元是以这个程序单元拥有者的特权来执行它的,也就是说,任何具有这个PL/SQL程序单元执行权的用户都可以访问程序中的对象.所有具有执行权的用户都有相同的访问权限,在定义者权限下,执行的用户操作的schema为定义者,所操作的对象是定义者在编译时指定的对象. 调用者权限:调用者权限是指当前用户(而不是程序的创建者)执行PL/SQL程序体的权限.这意味着不同的用户对于某个对象具有的权限很可

PL/SQL专家指南4——调用者权限和定义者权限 下篇

-------------------------------------------------------------调用者权限和定义者权限学习--------------------------------------------------- 转自群友shehasgone: --调用者权限的存储过程  print_table create or replace procedure print_table(p_query in varchar2) authid current_user i

android studio mainfest能否可视化添加组件权限等?怎么操作

问题描述 android studio mainfest能否可视化添加组件权限等?怎么操作 如题 有没有快捷方式 像adt那样图形化的添加的界面 有的话应该怎么设置添加呢 解决方案 这个真没有,有的话就直接在下面列出来了,所以说还是用Eclipse + ADT 比较方便 解决方案二: 有一点比Eclipse就是轻量些,启动速度快!

Oracle 定义者权限与调用者权限(AUTHID CURRENT_USER)

Oracle定义者权限与调用者权限(AUTHID CURRENT_USER) 参考: http://blog.itpub.net/7607759/viewspace-166557/ http://blog.itpub.net/7607759/viewspace-166558 http://blog.163.com/l_yongfei/blog/static/265673042009420103210297/ 正如大家所知,Oracle从8i开始引入了调用者权限体系结构,之前一直使用定义者权限体系

Asp.Net2.0权限树中Checkbox的操作

asp.net 这里使用asp.net2.0的TreeView控件结合JavaScript实现权限树的部分功能. 假设权限树中有如下三条规则: 1.该节点可以访问,则他的父节点也必能访问: 2.该节点可以访问,则他的子节点也都能访问: 3.该节点不可访问,则他的子节点也不能访问. 代码如下://获取元素指定tagName的父元素function public_GetParentByTagName(element, tagName) {    var parent = element.parent

win8系统下需要权限来执行此操作怎么办?

  但有的时候系统却弹出权限不足不能删除的问题,于是在改权限时发现权限也不能更改,或是更改了之后还是不能删除,这些可能就需要用到36第三方软件来解决了. 但这些方法每次设置起来步骤较为麻烦,这里给出一个技巧,只要将代码另存为指定文件,以后直接右键运行一次就行了! 首先,打开记事本. 单击"开始"菜单的"运行"命令: 在打开的"运行"对话框中输入"notepad",再单击"确定"按钮: 再将以下内容复制到记事

Asp.Net2.0权限树中Checkbox的操作_实用技巧

这里使用asp.net2.0的TreeView控件结合JavaScript实现权限树的部分功能. 假设权限树中有如下三条规则: 1.该节点可以访问,则他的父节点也必能访问: 2.该节点可以访问,则他的子节点也都能访问: 3.该节点不可访问,则他的子节点也不能访问. 代码如下://获取元素指定tagName的父元素function public_GetParentByTagName(element, tagName) {    var parent = element.parentNode;   

提示您需要权限来执行此操作怎么办

首先,打开记事本.单击"开始"菜单的"运行"命令: 在打开的"运行"对话框中输入"notepad",再单击"确定"按钮: 再将以下内容复制到记事本中: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*shellrunas] @="取得管理员所有权" "NoWorkingDirectory"="&

【OSS 最佳实践】OSS 操作权限控制

用户操作 OSS 时是需要根据账号的 AccessKeyId 和 AccessKeySecret (后续简称 AK 和 SK )进行权限验证的,这里的 AK 和 SK 包括有多种类型:主账号的 AK 和 SK .子账号的 AK 和 SK 以及 STS 生成的临时 AK . SK 和 Token .那么他们之间有什么区别呢?具体应该如何配置使用呢?本文将带大家一起认识相关概念. 1. 概念区别 主账号的 AK 和 SK 是主账号对应的权限标识,也就是说主账号的每对 AK和 SK 是拥有账号下的所有