簡體   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