Как я могу найти ВЛАДЕЛЬЦА объекта в Oracle?

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

Ответы

Ответ 1

Вы можете запросить представление 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

Интересный вопрос - я не думаю, что есть какая-либо функция Oracle, которая делает это (почти как "какая" команда в 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')

Ответ 3

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

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

select Constraint_Name
from All_Constraints
where Table_Name = 'WHICHEVER_TABLE'
  and Constraint_Type = 'R' and Owner = User;

Ответ 4

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

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

Ответ 5

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

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

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>';