Получение информации DBA_USERS

Я пытаюсь получить идентификатор USER из DBA_USERS, как мы можем сделать в DBA_ROLES.

Я попытался получить столбец ROWID из DBA_ROLES, но получил следующее предупреждение:

«ORA-01445: невозможно выбрать ROWID или образец представления соединения без таблицы с сохраненным ключом»

Насколько я понимаю, DBA_USERS — это представление, сгенерированное Oracle, и получить этот ROWID невозможно. Я прав?

Если это правильно, как я могу узнать, из каких таблиц создается это представление? Или как я могу узнать ROWID ПОЛЬЗОВАТЕЛЯ?

С уважением!

Сэм


person Sammy    schedule 24.09.2014    source источник
comment
Вы ищете несуществующее поле. Вот список полей, доступных в документах DBA_USERS .oracle.com/cd/E21901_01/doc/timesten.1122/e21644/   -  person Arun    schedule 24.09.2014


Ответы (3)


Я пытаюсь получить идентификатор USER из DBA_USERS.

Вы ищете DBA_USERS.USER_ID :

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

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

Я пытался восстановить столбец ROWID

ROWID здесь не при чем. Это своего рода «указатели» на физическое хранилище строк. При определенных условиях они могут быть изменены. Поскольку представления не имеют физического хранилища, ROWID для них не имеет смысла — отсюда и ошибка "ORA-01445" :

от oraerr:
ORA-01445: невозможно выбрать ROWID из представления соединения без таблицы с сохраненным ключом

Причина. Оператор SELECT попытался выбрать ROWID из представления, полученного в результате операции соединения. Поскольку строки, выбранные в представлении, не соответствуют базовым физическим записям, никакие идентификаторы ROWID не могут быть возвращены.

Действие: Удалите ROWID из предложения выбора представления, затем повторно выполните оператор.

person Sylvain Leroux    schedule 24.09.2014

То, о чем говорит Сильвен, это 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|

Идентификатор строки может быть полезен, когда вы хотите обновить строку. Вы можете сказать where rowid= ... или в других случаях, когда вы хотите сослаться на строку, которая у вас уже есть. Я считаю, что это самый быстрый способ получить доступ к строке.

Но я не понимаю, зачем вам нужен rowid в вашем запросе.

person Martin Drautzburg    schedule 24.09.2014
comment
Спасибо, что указали на мою глупую ошибку. Я отредактировал свой ответ, чтобы исправить это. - person Sylvain Leroux; 25.09.2014

DBA_USERS — это представление, представление, состоящее из запроса к нескольким таблицам.

ORA-01445 означает, что Oracle не может получить запрошенный вами ROWID из-за того, что вам нужно запросить соответствующую таблицу напрямую (или изменить представление SQL и также запросить ROWID ), чтобы получить соответствующий ROWID (само собой разумеется, что если ваше представление создано путем объединения нескольких таблиц — как Oracle может определить, какой ROWID вам нужен?).

«Основная» таблица DBA_USERS получает данные из таблицы sys.USER$.

Чтобы получить ROWID, сначала посмотрите на SQL за DBA_USERS (это очень просто в большинстве IDE), чтобы понять, какие данные вы хотите запросить, кроме ROWID.

Затем вы можете просто запросить:

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

(или любой другой столбец, который вам нужен).

Удачи!

person golosovsky    schedule 09.12.2014