一、 背景

用户在数据库执行语句时遇到一个奇怪的报错,这个sql执行一共会返回500多万行数据,但每返回到400多万行时就报错ORA-00942:表或视图不存在(sql中所用表和包已授权)

此处省略报错sql
ERROR:
ORA-00942: table or view does not exist
ORA-06512: at "APPS.TEST_API", line 39
ORA-06512: at "APPS.TEST_API", line 679
ORA-06512: at line 1

4493670 rows selected.

可以看到报错的包是APPS.TEST_API

有几种方法可定位到报错的表:

  • 10046 trace:alter session set events '10046 trace name context forever,level 3';
  • 942事件trace:ALTER session SET EVENTS '942 trace name context forever, level 3';
  • 根据报错行数去存储过程里找对应的表

二、 解决方法

找到报错表后创建public同义词并给用户授权

create public synonym xxx for user1.xxx;
grant select on user1.xxx to user2;

这个问题定位和处理方法都不难,但想找一下根因。

有两个奇怪的问题:

  • 为什么用户已经有APPS.TEST_API包的执行权限还需要对其中的表额外授权?
  • 为什么能返回400多万行数据,而不是在语句编译时就报错?

三、 报错原因分析

1. 定义者权限 vs 调用者权限

①  AUTHID DEFINER(定义者权限,DR):指编译存储对象的所有者,也是默认权限模式。因此通常我们只需要授予用户包的执行权限,而不需要授予包中表的执行权限。

②  AUTHID CURRENT_USER(调用者权限,IR):指拥有当前会话权限的模式,这可能和当前登录用户相同或不同(alter session set current_schema 可以改变调用者Schema)。它以执行的用户权限来处理涉及的对象权限,这是典型的,数据库中只创建一个存储过程,所有用户都可以使用,但每个用户使用的时候只是用自己的权限执行。

根据报错的现象,其实符合IR的特点。查看报错包的定义:

create or replace package apps.test_api authid current user as ...

注意到authid current user as,可以看到确实用的就是IR,所以使用apps用户执行不会有这样的报错,而使用其他用户很可能就会报错表不存在。另外由于这个包是系统自带的,最好不要修改代码。

2.     动态sql vs 静态sql 权限检查过程

另外一个问题是,为什么能返回400多万行数据,而不是在语句编译时就报错

在官方文档中找到了这样一段介绍:

For dynamic SQL statements issued by a PL/SQL unit, name resolution and privilege checking are done once, at run time.

For static SQL statements, name resolution and privilege checking are done twice: first, when the PL/SQL unit is compiled, and then again at run time.

  • At compile time, the AUTHID property has no effect—both DR and IR units are treated like DR units.
  • At run time, however, the AUTHID property determines whether a unit is IR or DR, and the unit is treated accordingly.

对于plsql中的动态sql,Oracle只在运行阶段进行一次权限检查。

对于静态sql,则会检查两次。

  • 第一次在编译阶段,无论是DR还是IR,都当做DR处理,所以在编译阶段该sql没有报错
  • 第二次在运行阶段,此时会区分DR和IR,所以当运行到无权限表时就会报错。

四、 测试环境复现

apps用户创建测试对象

create or replace package testpkg AUTHID CURRENT_USER AS
procedure testpri;
procedure testpri_2;
end testpkg;
/create or replace package body testpkg
as
procedure testpri
is
V_A number;
begin
select A into V_A from apps.test where rownum<2;
dbms_output.put_line(V_A);
end;
procedure testpri_2
is
V_B number;
begin
testpri;
select B into V_B from test2 where rownum<2;
dbms_output.put_line(V_B);
end;
end testpkg;
/

apps用户测试执行:正常输出

SQL> set serveroutput on
SQL> exec apps.testpkg.testpri_2;
1
2PL/SQL procedure successfully completed.

apps用户授包执行权限给 TESTPRI 用户

grant execute on apps.testpkg to TESTPRI;
grant select on apps.test to TESTPRI;conn TESTPRI/TESTPRI
SQL> set serveroutput on
SQL> exec apps.testpkg.testpri_2;
1BEGIN apps.testpkg.testpri_2; END;
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "APPS.TESTPKG", line 16
ORA-06512: at line 1

可以看到第一个存储过程执行正常而第二个存储过程执行就报错了

参考:

http://dbaora.com/authid-current_user-authid-definer/

https://blog.csdn.net/shcqupc/article/details/51320792

http://www.voidcn.com/article/p-sxctwtao-gc.html

https://docs.oracle.com/database/121/LNPLS/subprograms.htm#LNPLS00809

奇怪的ORA-00942:表或视图不存在相关推荐

  1. 00942 ora 表存在_ORA-00942: 表或视图不存在 的原因和解决方法

    采用Oracle数据库,使用Powerdesigner设计,生成Sql文件导入后查询出现"ORA-00942: 表或视图不存在 ",很是郁闷,这个问题以前出现过,当初解决了,但因好 ...

  2. 03 ORA系列:ORA-00942 表或视图不存在 table or view does not exist

    如果希望对常见的Oracle异常ORA报错解决方案有系统的了解,请看<ORACLE系列异常总结ORA>. 原因: 1.表或视图名称拼写错误 2.表或视图在其他用户下,或用户名写错 比如:t ...

  3. 00942 oracle_Oracle ODI报错-ORA-00942: 表或视图不存在,求解决方案?

    目前我在研究Oracle ODI,做了两个例子.发现其中有些问题,百思不得其解.特在此请教各位. 我做了一个很简单的例子,将本地数据库中的SCOTT用户的EMP表中数据,装载到同一数据库中另一用户的E ...

  4. 00942 oracle_Oracle物化视图创建报ORA-00942错误解决

    在Oracle 10g的数据库中,将一个物化视图做了一个简单的条件子句修改,删除后重建,但是,就建不成功,报ORA-00942表或视图不存在错误. 这个问题很奇怪,我首先想这会是一个bug吗?找了or ...

  5. ORA 00942 table or view does not exist

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在过程, ...

  6. 使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理

    使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在. Caused by: java.sql.S ...

  7. java表或视图不存在_Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在...

    本人用SSM框架写的后台服务,在调用服务时出现以下错误,请问这个该怎么解决? 备注:表和视图在数据库中是存在的,将sql语句放入qlsql也能查出数据. Error querying database ...

  8. HubbleDotNet 开源全文搜索数据库项目--为数据库现有表或视图建立全文索引(三) 多表关联全文索引模式...

    关系型数据库中,多表关联是很常见的事情,HubbleDotNet 可以对部分情况的多表关联形式建立关联的全文索引,这样用户就不需要专门建一个大表 来解决多表关联时的全文索引问题. 下面以 为数据库现有 ...

  9. SQL Server 获取表或视图结构信息

    ------------获取表或视图的结构信息(ObjName:表名或视图名) Select o.name as Oname,c.name As name , t.name As type,c.Len ...

最新文章

  1. VISP视觉库识别AprilTag详细解读
  2. python语言怎么学-如何学习Python,以及新手如何入门?
  3. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析
  4. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  5. 最全python爬虫库安装详解
  6. 信息学奥赛一本通(1326:【例7.5】 取余运算(mod))
  7. 数据库中系统数据库服务器,sql中什么是系统数据库服务器
  8. 第1章 数据可视化概述
  9. 完美C语言通讯录(含代码)
  10. 【解决】速达服务启动失败,文件无效
  11. 互联网专用计算机屏保,5款屏保,让你的电脑在闲置时也与众不同。
  12. 破14亿,用Python分析我国存在哪些人口危机!
  13. 达梦数据库(简称DM)的初级教程分享
  14. GAMES101-现代计算机图形学入门-闫令琪——Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering) 学习笔记
  15. Delphi动态创建MainMenu和PopupMenu菜单的方法
  16. python中批量将矩形图片转化为正方形图片,并且缩放
  17. 图片转文字怎么弄?图文转换方式说明
  18. Linux账户标识R=400是什么意思_linux后台开发具备能力集锦
  19. 电脑通过Putty远程连接树莓派
  20. Opencv学习笔记 - OpenCV 4机器学习算法简介

热门文章

  1. 十大热销HR软件实施优势和风险比较
  2. 大学四年如何成为优秀的ACM大牛
  3. 如何使用YYCache存储自定义对象
  4. [深度学习] 不平衡样本的处理
  5. 宇视项目新手||集成商超级开局法——详细版
  6. leetcode- 实现二叉树先序,中序和后序遍历
  7. 3、宽带对称式高回退Doherty放大器ADS仿真(带版图)
  8. rpr和http服务浅谈
  9. 3D动画——正方体的旋转与张开
  10. wx.showLoading不显示