2014-09-24 128 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$; 

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

祝你好运!