【问题标题】:Oracle stored procedure showing error for 'dba_segments' : table does not exist [duplicate]Oracle 存储过程显示“dba_segments”错误:表不存在 [重复]
【发布时间】:2013-11-06 14:15:58
【问题描述】:

我确实尝试在 oracle 10g 数据库中创建一个存储过程,它从 dba_segments 中选择数据并插入另一个表(即 table_space)。

创建或替换 程序 P_DAILY_ENTRY 是 an_job_id 编号; 开始 插入表空间(表名,最大尺寸,日期最大尺寸) 选择表名, TRUNC(SUM(字节)/1024) 最大尺寸, sysdate date_of_max_size 从 ( 选择段名表名,所有者,字节 FROM dba_segments WHERE segment_type = 'TABLE' 联合所有 选择段名表名,所有者,字节 FROM dba_segments WHERE segment_type = '索引' ) 所有者在哪里(“克拉”) GROUP BY 表名,所有者 ORDER BY SUM(bytes) DESC; 其他情况除外 回滚; 结束 P_DAILY_ENTRY;

当我运行上面它显示以下两个错误:

  • 05 行 |执行 | PL/SQL:忽略 SQL 语句
  • 第 12 行 |执行 | PL/SQL: ORA00942: 表或视图不存在

但是,如果单独执行INSERT 语句,它会填充table_space 表。

【问题讨论】:

  • dba_segments 是一个系统表。它存在,但您无权访问它。与您的 DBA 讨论获得必要的许可。
  • @Joe 我确实对dba_segments 拥有SELECT 权限,这就是INSERT 语句在单独执行时起作用的原因。我不明白为什么这个错误只出现在程序的情况下!
  • @Satyendra - 您在dba_segments 上的权限是直接授予您还是通过角色授予? Roles are disabled in named blocks with definer's rights.
  • @AlexPoole 感谢您的链接! cagcowboy(接受一个)的回答说,程序的所有者也必须拥有桌子上的权利。但是,就我而言,这两种情况的“所有者”都是相同的。
  • @Satyendra - 接受的答案还强调权利必须是直接的,而不是通过角色,这就是我的链接所说的。文森特的回答显示了如何确认这是您的问题。

标签: oracle stored-procedures


【解决方案1】:

这很可能是权限问题,因为您可以执行的 INSERTs 不一定是过程所有者可以执行的命令(这与 Oracle 中的调用者/定义者权限架构有关)。

ORA-00942 可以解决许多问题,一个常见的问题是如果您无法“看到”该表,则该表被视为不存在(这是有道理的:许多 oracle 错误消息旨在阻止人们发现更多信息)关于数据库设置的故意简洁)。

【讨论】:

  • @devek 最初我也认为这是一个“权限问题”,但后来我单独执行了INSERT 语句并且它起作用了。此问题仅在存储过程的情况下出现。
  • 是的,但是“您”可能拥有 INSERT 权限,但过程的所有者没有。并且您的权利不会转移到您创建的程序中。
猜你喜欢
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2015-05-02
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多