繁体   English   中英

我的Oracle视图使用了一个不存在的表,但我仍然可以查询它

[英]My Oracle view uses a table that doesn't exist, but I can still query it

我有一个Oracle视图,它使用我在任何地方都找不到的表。 但是,我仍然可以查询视图,我认为这是不可能的。

视图内容是否缓存在某个地方,从表格仍然存在的时候开始,还是我对表格看起来不够努力?

为了清楚起见:我已经查看了ALL_TABLES和ALL_OBJECTS,并且表中(或其他任何内容)都没有出现。

这很有可能。在视图上授予select不会在基础表上授予select。 这允许我创建一个视图,从表中公开一些我不希望你看到的列。 您必须具有对表的访问权限才能在ALL_TABLES视图中显示它。 如果它确实是一个表,您应该能够在DBA_TABLES视图中找到它(假设您可以访问DBA_TABLES视图),该视图包含所有内容,而不仅仅是您的用户拥有权限的表。

事实上,ALL_TABLES视图就是这种情况的完美例子。 我打赌你也找不到该视图中使用的表,因为你可能没有它所基于的SYS表的权限(例如SYS.user $,SYS.obj $等)。

还要检查“缺失”表是否实际上是同义词:

SELECT table_owner, table_name
  FROM all_synonyms
 WHERE table_name = 'MISSING_TABLE';

如果它不是同义词,请尝试查看表的all_tables字典视图:

SELECT owner, table_name
  FROM all_tables
 WHERE table_name = 'MISSING_TABLE';

检查视图中找不到的表引用的架构 - 它可能不是当前架构,但当前架构在特定表上具有SELECT权限(至少)。

一旦了解了架构,它就应该有助于确定该表是否实际上是当前架构中的一个视图。 或者它可以是同义词,它存在于当前模式中 - 与所有模式中的公共同义词相同,因此您必须检查同义词以查看其指向的位置。

这可能是物化观点吗? 这是数据的副本,因此即使删除了基表,它也会继续存在。

我会确保你没有说出来

Create Table "TableName"
  ("ColumnName" Number(10,0))....

如果您尝试使用以下脚本引用这些:

Select ColumnName from TableName....

它不会工作。 这是因为Oracle使用不带引号的名称(如TableName)并将它们转换为TABLENAME而不存在,因为当您使用“TableName”声明它时,您实际上说“只响应具有此引号的具有此确切大小写的查询

所以以下内容会起作用:

Select "ColumnName" from "TableName"....

但基本上你不应该使用区分大小写的定义,因为它们需要引用每个查询。

相反

Create Table TableName
  (ColumnName Number(10,0))....

并且它会响应您在查询时使用的任何大小写

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM