【问题标题】:Oracle Express Edition 11gR2: "table or view does not exist" but it shows in "dba_tables"!Oracle Express Edition 11gR2:“表或视图不存在”,但它显示在“dba_tables”中!
【发布时间】:2013-02-26 07:05:53
【问题描述】:

好的,这是我的问题。

我正在使用一些 ETL 工具,它在我的 Oracle XE 中创建了一些表。然后我注意到我既不能访问这些表也不能删除它们。

正如您在屏幕截图中看到的那样(我无法发布图片,所以我不得不复制/粘贴文本)。查询“dba_tables”会显示该表,但删除它时,Oracle 会说“不存在”。

SQL> select table_name from dba_tables where owner='HR';

TABLE_NAME
------------------------------
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
DetailedOrders
COUNTRIES

8 rows selected.

SQL> drop table HR.DetailedOrders cascade constraints;
drop table HR.DetailedOrders cascade constraints
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL>

我也试过: 创建一个同名的空表——成功! 然后放下它——成功! 查询dba_tables或者user_tables,还在!

这是一个已知问题吗?我该如何解决?

谢谢,

杰里米

【问题讨论】:

    标签: oracle-xe


    【解决方案1】:

    当您执行这些命令时,您是以什么用户身份登录的?

    假设您以 HR 以外的用户身份登录(听起来您可能是这样),您可以通过查询 DBA_TABLES 发现表存在但您没有有任何特权对桌子做任何事情。这意味着您的帐户已被授予SELECT ANY DICTIONARY 特权或SELECT_CATALOG_ROLE 角色之类的权限,但尚未明确获得hr.DetailedOrders 的特权。当您尝试对您没有权限的表执行某些操作时遇到的错误是 ORA-00942,并且错误消息的设计是为了不会无意中向攻击者提供有关数据库中可能存在的表的信息通过告诉您问题是该表确实不存在还是确实存在并且您没有权限。如果您碰巧使用已被授予访问DBA_TABLES 的帐户,这可能会使错误有点混乱。

    “创建一个同名的空表”是什么意思?您是在谈论在当前架构中创建表 DetailedOrders 吗?如果是这样,那也应该会起作用(就像丢表一样)。每个模式都是一个单独的命名空间。因此,如果您愿意,可以在数据库的每个模式中拥有一个 DetailedOrders 对象。其中一些可能是表,一些可能是视图,一些甚至可能是存储过程——当然,这没有多大意义,但肯定可以做到。

    此外,DetailedOrders 表似乎是作为区分大小写的标识符创建的。这是一个可怕的想法。 Oracle 默认使用不区分大小写的标识符,但如果您用双引号将标识符括起来,则可能会强制使用区分大小写的标识符。这是StackOverflow thread that discusses case-sensitive vs. case-insensitive identifiers 的详细信息。不过,简短的回答是,如果您确实有能力删除表格,则需要执行类似的操作

    DROP TABLE HR."DetailedOrders"
    

    表的名称用双引号括起来,并且大小写与您在数据字典中看到的大小写匹配。每次查询表时也必须这样做。许多工具不能很好地处理区分大小写的标识符,如果您在他们的数据库中创建区分大小写的标识符,未来的开发人员会诅咒您的名字。但你可以做到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多