是的,这是我的问题。
我正在玩一些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,它仍然存在!
这是一个知道问题吗?我该如何解决?
谢谢,
杰里米
答案 0 :(得分:4)
当您执行这些命令时,您登录的是什么用户?
假设您以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"
其中表的名称用双引号括起来,外壳与您在数据字典中看到的外壳相匹配。每次查询表时都必须这样做。许多工具不能很好地处理区分大小写的标识符,如果您在其数据库中创建区分大小写的标识符,未来的开发人员将诅咒您的名称。但你可以做到。