Как я могу найти ВЛАДЕЛЬЦА объекта в Oracle? - PullRequest
17 голосов
/ 04 июня 2009

Я хочу найти внешние ключи таблицы, но может быть несколько пользователей / схем с таблицей с одинаковым именем. Как я могу найти тот, который видит текущий зарегистрированный пользователь? Есть ли функция, которая дает ее владельцу? Что если есть общедоступные синонимы?

Ответы [ 5 ]

33 голосов
/ 04 июня 2009

Вы можете запросить представление ALL_OBJECTS:

select owner
     , object_name
     , object_type
  from ALL_OBJECTS
 where object_name = 'FOO'

Чтобы найти синонимы:

select *
  from ALL_SYNONYMS
 where synonym_name = 'FOO'

Просто чтобы уточнить, если оператор SQL пользователя пользователь ссылается на имя объекта без указания схемы (например, 'FOO'), Oracle FIRST проверяет схему пользователя на предмет этого имени (включая синонимы в схема этого пользователя). Если Oracle не может разрешить ссылку из схемы пользователя, Oracle проверяет общедоступный синоним.

Если вы ищете специально ограничения для определенного имени таблицы:

select c.*
  from all_constraints c 
 where c.table_name = 'FOO'
 union all
select cs.*
  from all_constraints cs
  join all_synonyms s 
    on (s.table_name = cs.table_name
     and s.table_owner = cs.owner 
     and s.synonym_name = 'FOO'
       )

НТН

- приложение:

Если вашему пользователю предоставлен доступ к представлениям DBA_ (например, если вашему пользователю предоставлен SELECT_CATALOG_ROLE), вы можете заменить 'DBA_' вместо 'ALL_' в предыдущих примерах SQL. Представления ALL_x показывают только объекты, которым вы предоставили привилегии. В представлениях DBA_x будут показаны все объекты базы данных, независимо от того, есть у вас права на них или нет.

2 голосов
/ 04 июня 2009

Интересный вопрос - я не думаю, что есть какая-либо функция Oracle, которая делает это (почти как команда "which" в Unix), но вы можете получить порядок разрешения для имени:

select * from 
(
 select  object_name objname, object_type, 'my object' details, 1 resolveOrder 
  from user_objects
  where object_type not like 'SYNONYM'
 union all
 select synonym_name obj , 'my synonym', table_owner||'.'||table_name, 2 resolveOrder
  from user_synonyms
 union all
 select  synonym_name obj , 'public synonym', table_owner||'.'||table_name, 3 resolveOrder
  from all_synonyms where owner = 'PUBLIC'
)
where objname like upper('&objOfInterest')
1 голос
/ 07 марта 2017

Я нашел этот вопрос в качестве наилучшего результата, пока гуглил, как найти владельца таблицы в Oracle, поэтому я подумал, что я внесу конкретный для таблицы ответ для удобства других.

Чтобы найти владельца определенной таблицы в БД Oracle, используйте следующий запрос:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>';
1 голос
/ 04 июня 2009

Представления Oracle, такие как ALL_TABLES и ALL_CONSTRAINTS, имеют столбец владельца, который можно использовать для ограничения вашего запроса. Существуют также варианты этих таблиц, начинающиеся с USER вместо ALL, в которых перечислены только те объекты, к которым может обратиться текущий пользователь.

Один из этих просмотров должен помочь решить вашу проблему. Они всегда хорошо работали для меня для подобных проблем.

1 голос
/ 04 июня 2009

Чтобы найти имя текущего пользователя в сеансе Oracle, используйте функцию USER.

Обратите внимание, что владелец ограничения, владелец таблицы, содержащей внешний ключ, и владелец ссылочной таблицы могут отличаться. Похоже, это владелец таблицы, который вас интересует, и в этом случае это должно быть близко к тому, что вы хотите:

select Constraint_Name
from All_Constraints
where Table_Name = 'WHICHEVER_TABLE'
  and Constraint_Type = 'R' and Owner = User;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...