开发者社区> 张振磊> 正文

oracle编译存储过程提示表或视图不存在的问题分析

简介:        今天有同事跟我反映有个存储过程编译报错,提示表或视图不存在。存储过程中调用的那个表t是另一个用户b的表。
+关注继续查看

       今天有同事跟我反映有个存储过程编译报错,提示表或视图不存在。存储过程中调用的那个表t是另一个用户b的表。但是当前用户a已经拥有dba角色了,为什么访问不到用户b的表t呢?另一同事说,只要给用户a分配操作用户b的表t的权限就可以了。他的解释是用户即便拥有dba的角色也不一定能操作别的用户的对象。很明显这个解释是错误的。dba角色是数据库管理员的角色,肯定能操作数据库中所有用户的对象。我开始怀疑问题是不是出在存储过程上了。

       经过查看资料,发现存储过程可以定义为定义者权限(DEFINER)或者调用者权限(CURRENT_USER)。默认情况下是定义者权限。定义者权限将会禁止调用者的所有role权限。这也就解释了上面案例中为什么用户a拥有了dba的角色,却不能在存储过程中调用用户b的表t。调用者权限不会禁止调用者所获得的所有role权限。但是,不管是定义者权限还是调用者权限,存储过程在编译的时候,都不会判断role角色的权限,所以如果没有给用户a分配操作用户b的表t的权限的话,使用静态sql是无法编译通过的。只能使用动态sql(编译的时候不判断,执行的时候判断)。

      下面我将写两个测试的存储过程分别定义为定义者权限和调用者权限:

      1.定义者权限

       CREATE OR REPLACE PROCEDURE test1 AUTHID DEFINER AS
       v_sql varchar2(2000) := '';
       BEGIN
             v_sql := 'update b.t set pydm =''LM1'' where yhid =''162''';
             EXECUTE IMMEDIATE v_sql;
       END test1;

      2.调用者权限
        CREATE OR REPLACE PROCEDURE test2 AUTHID CURRENT_USER AS 
         v_sql varchar2(2000) := '';
        BEGIN
             v_sql := 'update b.t set pydm =''LM1'' where yhid =''162''';
             EXECUTE IMMEDIATE v_sql;
         END test2;

       经过测试发现,在不给用户a分配操作用户b的表t的权限的情况下,如果用户a拥有dba角色,exec test1 会提示表或视图不存在的错误,而exec test2 会执行成功。

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
.NET数据库编程求索之路--6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)
6.使用ADO.NET实现(三层架构篇-使用List传递数据-基于存储过程)(2)      【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.
802 0
理解和使用Oracle分析工具LogMiner
用LogMiner             理解和使用Oracle   8i分析工具LogMiner                 Oracle   LogMiner   是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle   重作日志文件(归档日志文件)中的具体内容,特别是,该工具可以分析出所有对于数据库操作的DML(insert、update、delete等)语句,另外还可分析得到一些必要的回滚SQL语句。
1223 0
通过定制orabbix监控分析潜在的Oracle问题
在之前的博客中分享过 简单定制Orabbix监控项   http://blog.itpub.net/23718752/viewspace-1769773/ 定制的功能在Orabbix中实现非常灵活而且轻巧,还是能够感受到一种开源风的清爽。
840 0
SSM框架之关于使用JSP作为视图展示问题解决方案
JSP作为视图层展示数据,已经有很长一段时间了,不管是在校学习还是企业工作,总会或多或少接触这个。特别是对于一些传统中小型或者一些几年前的企业而言,有很多使用JSP作为视图展示层。 JSP本质是就是Servlet,Servlet可以说也是JSP。
1632 0
+关注
张振磊
系统架构师,软件设计师,oracle认证专家
43
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载