Как я могу найти ВЛАДЕЛЬЦА объекта в 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>';