PL/SQL中ORA-00942错的进一步研究

简介:
   对于写某些数据库监控或者编写的过程、函数或包等PL/SQL的对象,如果其中包含ORACLE内部的动态性能试图(DYNAMIC PERFORMANCE VIEW)和数据字典时,常常会遇到如下错误:
    
Error: PL/SQL: ORA-00942: table or view does not exist

      查看一下错误原因:
Cause: The table or view entered does not exist, a synonym that is not allowed here was used, or a view was referenced where a table is required. Existing user tables and views can be listed by querying the data dictionary. Certain privileges may be required to access the table. If an application returned this message, the table the application tried to access does not exist in the database, or the application does not have access to it.

Action: Check each of the following:

the spelling of the table or view name.

that a view is not specified where a table is required.

that an existing table or view name exists.

Contact the database administrator if the table needs to be created or if user or application privileges are required to access the table.

Also, if attempting to access a table or view in another schema, make certain the correct schema is referenced and that access to the object is granted.
   
      但是大家往往都非常愕然,奇怪呀,明明在SQL/PLUS中是可以直接查询的呀,并且返回了结果。但是为什么在编译过程、函数或者包时有错误出现呢?
      其实不然,只能说明我们当前的用户还没有足够的权限。
      那好,就直接授权,使得某个用户可以有确定的查询权限:
    
SQL> grant select on dba_tablespaces to xxx;

Grant succeeded.

SQL> grant select on v$session to xxx;
grant select on v$session to asg
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views
      
      进行上述操作,可以看到数据字典(DATA DICTIONARY)可以直接授权,而使用了。但是DYNAMIC PERFORMANCE VIEW却不可以,并且报了ORA-02030的错误。
    
can only select from fixed tables/views

Cause: An attempt is being made to perform an operation other than a retrieval from a fixed table/view.

Action: You may only select rows from fixed tables/views.

      看到了,对于V$SESSION我的授权是有问题的!对,也就是说V$根本不是个VIEWS(如果你说根本不是TABLES,后面的论述就可以不用看了 -:)) 。
      看看ORACLE给出的说明:
     
V$ Views

The actual dynamic performance views are identified by the prefix  V_$Public synonyms  for these views have the prefix  V$. Database administrators and other users should access only the  V$ objects, not the  V_$ objects.
   
      很显然,V$可以说是个“同义词”!所以会出现授权的错误。
      那么该如何授权呢?对,按照ORACLE给出的规则,按图索骥:
SQL> grant select on v_$session to XXX;

Grant succeeded.

      可以看到授权成功,为了编译成功,我们还要对编写的程序脚本进行轻微的改动,什么?对,就是将V$SESSION改写成SYS.V_$SESSION即可。
      接下来,再想想,如果我们编写的内容,涉及比较多的DATA DICTIONARY或者是DYNAMIC PERFORMANCE VIEW,我们一个一个授权岂不是很麻烦?
      我们可以通过ORACLE预先定义的角色,一次性完成授权:
     
SQL> grant select any  dictionary to xxx;

Grant succeeded.

     这样,我就可以直接使用DATA DICTIONARY和DYNAMIC PERFORMANCE VIEW。但是,一定要注意,这样的授权对于数据库的安全性来讲是不利的。
     ------------------------
      从ORA-00942开始的问题,我们将问题引申到DYNAMIC PERFORMANCE VIEW和ORACLE SECURITY等方面,确实很有意思。所以说,对于ORACLE的学习,多动手,多读官方文档,多总结总结确实很重要呀。

      技术没有障碍,就看你肯不肯钻 -:)

本文转自Be the miracle!博客51CTO博客,原文链接http://blog.51cto.com/miracle/93450如需转载请自行联系原作者


Larry.Yue

相关文章
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
2月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
42 2
|
5月前
|
SQL Oracle 关系型数据库
SQL与PL/SQL:数据库编程语言的比较
【8月更文挑战第31天】
111 0
|
7月前
|
SQL 数据库 Perl
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
PL/SQL中执行按钮变为灰色后如何恢复【已解决】
564 0
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
8月前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。
|
8月前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL显式游标:数据的“私人导游”与“定制之旅”
【4月更文挑战第19天】Oracle PL/SQL中的显式游标提供灵活精确的数据访问,与隐式游标不同,需手动定义、打开、获取和关闭。通过DECLARE定义游标及SQL查询,OPEN启动查询,FETCH逐行获取数据,CLOSE释放资源。显式游标适用于复杂数据处理,但应注意SQL效率、游标管理及异常处理。它是数据海洋的私人导游,助力实现业务逻辑和数据探险。
|
8月前
|
SQL Oracle 安全
Oracle的PL/SQL异常处理方法:守护数据之旅的“魔法盾”
【4月更文挑战第19天】Oracle PL/SQL的异常处理机制是保障数据安全的关键。通过预定义异常(如`NO_DATA_FOUND`)和自定义异常,开发者能优雅地管理错误。异常在子程序中抛出后会向上传播,直到被捕获,提供了一种集中处理错误的方式。理解和善用异常处理,如同手持“魔法盾”,确保程序在面对如除数为零、违反约束等挑战时,能有效保护数据的完整性和程序的稳定性。