2014-09-24 177 views
0

我試圖從DBA_USERS中檢索用戶標識,就像我們在DBA_ROLES中所做的那樣。獲取DBA_USERS信息

我tryied從DBA_ROLES retreive ROWID列,但我得到這樣的警告:

ORA-01445:不能選擇ROWID,或樣品,連接視圖,沒有一個密鑰保存完好的表

從我所能理解的,DBA_USERS是一個Oracle生成的視圖,它不可能檢索到這個ROWID。我對嗎?

如果這是正確的,我怎麼知道這個視圖是從哪個表生成的?或者我怎麼知道用戶的ROWID?

親切的問候!

山姆

+0

您尋找不存在的字段。這裏是DBA_USERS http://docs.oracle.com/cd/E21901_01/doc/timesten.1122/e21644/systemtables.htm#TTSYS369 – Arun 2014-09-24 15:56:33

回答

4

我試圖獲取一個用戶ID,從DBA_USERS

您正在尋找DBA_USERS.USER_ID

SQL> SELECT USER_ID FROM DBA_USERS WHERE USERNAME = 'SYLVAIN'; 

    USER_ID 
---------- 
    48 

我tryied檢索ROWID

ROWID在這裏無所事事。這些對於行物理存儲來說是「指針」。在某些特定條件下,它們可能會發生變化。由於觀點沒有物理存儲,ROWID是沒有意義的他們 - 因此錯誤「ORA-01445」

oraerr
ORA-01445:不能選擇ROWID從加入 觀點,沒有一個密鑰保存完好的表

原因:SELECT語句試圖從連接操作派生的視圖 選擇的ROWID。因爲在視圖 中選擇的行不對應於基礎物理記錄,所以沒有ROWID可以返回 。

操作:從視圖選擇子句中刪除ROWID,然後重新執行 該語句。

0

什麼維爾託德在談論的是rownum不是rowid。 rownum是一個序號,而rowid表示一行的物理位置。

在這裏看到:當你想更新行

0:[email protected]> select rowid, rownum, xxx.* from xxx; 

Rowid    |rownum|x |y | 
------------------------------------ 
AAAS/3AAGAAAbmYAAA|  1|foo1|foo2| 
AAAS/3AAGAAAbmYAAB|  2|bar1|bar2| 

的ROWID可能是有用的。你可以說where rowid= ...或在你想引用某行已經「擁有」等案件。我相信這是訪問行的最快方式。

但我不明白你爲什麼會在您的查詢需要的ROWID。

+0

感謝您指出我的愚蠢的錯誤可用字段列表。我編輯了我的答案以糾正錯誤。 – 2014-09-24 20:18:42

0

DBA_USERS是一個視圖,它由在幾個表的查詢的視圖。

ORA-01445意味着Oracle無法檢索您請求的ROWID由於你需要查詢相關的表直接(或更改視圖SQL和查詢ROWID也)來獲得相關ROWID的事實(不用說,如果您的視圖是通過加入幾個表創建的 - Oracle如何確定您想要的ROWID?)。

DBA_USERS獲取數據的「主」表爲sys.USER $表。

要獲得ROWID,在後面的DBA_USERS SQL第一次看(這是對大多數IDE很簡單的)明白你想要除的ROWID要查詢的數據。

然後,你可以查詢:

select ROWID, USER# user_id, NAME username 
from sys.USER$; 

(或者你需要的任何其他列)。

祝你好運!