获取DBA_USERS信息

时间:2014-09-24 15:47:33

标签: oracle plsql database-administration oracle12c

我试图从DBA_USERS中检索一个USER ID,就像我们在DBA_ROLES中一样。

我已尝试从DBA_ROLES中检索ROWID列,但我收到此警告:

ORA-01445:无法从没有密钥保留表的连接视图中选择ROWID或采样

根据我的理解,DBA_USERS是Oracle生成的视图,无法检索此ROWID。我是对的吗?

如果这是正确的,我怎么知道从哪个表生成这个视图?或者我怎么知道用户的ROWID?

亲切的问候!

萨姆

3 个答案:

答案 0 :(得分:4)

  

我正在尝试从DBA_USERS

中检索USER ID

您正在寻找DBA_USERS.USER_ID

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

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

  

我试图检索ROWID

ROWID此处无关。这些是行物理存储的“指针”。在某些特定条件下,它们可能会发生变化。由于 views 没有物理存储,ROWID对他们来说毫无意义 - 因此错误“ORA-01445”

  来自oraerr


   ORA-01445:无法从联接中选择ROWID   没有密钥保存表的视图

     

原因:SELECT语句尝试从视图中选择ROWID   派生自联接操作。因为在视图中选择了行   不对应底层物理记录,没有ROWID可以   返回。

     

操作:从视图选择子句中删除ROWID,然后重新执行   声明。

答案 1 :(得分:0)

Sylvain所说的是rownum而不是rowid。 rownum是一个序列号,而rowid表示一行的物理位置。

见这里:

0:opal@spmdtz> select rowid, rownum, xxx.* from xxx;

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

当您想要更新行时,rowid非常有用。您可以说where rowid= ...或者在其他情况下您想要引用您已经"有"的行。我相信这是访问行的最快方式。

但我不明白你为什么需要查询中的rowid。

答案 2 :(得分: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$;

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

祝你好运!