3

对,这是我的问题。

我在玩一些 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,它还在!

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

谢谢,

杰里米

4

1 回答 1

4

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

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

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

此外,该DetailedOrders表似乎是作为区分大小写的标识符创建的。这是一个可怕的想法。Oracle 默认使用不区分大小写的标识符,但如果您用双引号将标识符括起来,则可能会强制使用区分大小写的标识符。这是一个StackOverflow 线程,它更详细地讨论了区分大小写与不区分大小写的标识符。不过,简短的回答是,如果你确实有能力放下桌子,你需要做类似的事情

DROP TABLE HR."DetailedOrders"

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

于 2013-02-25T23:05:53.353 回答