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 会执行成功。

 

 

目录
相关文章
|
9天前
|
存储 SQL Oracle
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
14 0
|
9天前
|
Oracle 关系型数据库 数据库
Oracle数据库 查询所有表
Oracle数据库 查询所有表
21 1
|
3月前
|
Oracle 关系型数据库 索引
Toad Oracle Parttion表分析
当一个数据表的数据达到几十亿笔的时候,对整个表做表分析代价较大。
36 0
|
4月前
|
Oracle 关系型数据库
【Oracle】建立关联三个表的视图
【Oracle】建立关联三个表的视图
|
5月前
|
Oracle 关系型数据库
oracle 12c新功能 recover table恢复单个表
不支持sys用户和system表空间的表
|
5月前
|
Oracle 关系型数据库
常用oracle语句-查看表注释表的字段以及注释
常用oracle语句-查看表注释表的字段以及注释
|
5月前
|
SQL Oracle 关系型数据库
Oracle查询优化-03操作多个表
Oracle查询优化-03操作多个表
36 0
|
5月前
|
SQL Oracle 关系型数据库
Oracle-表分析和索引分析解读
Oracle-表分析和索引分析解读
55 0
|
5月前
|
存储 SQL 监控
实践笔记:Oracle-表按天分区
实践笔记:Oracle-表按天分区
|
6月前
|
SQL Oracle 关系型数据库
Oracle 删除大量表记录操作总结
Oracle 删除大量表记录操作总结
90 0
推荐文章
更多