如何在Oracle中找到对象的所有者?

17 oracle

我想找到一个表的外键,但可能有多个用户/模式与一个具有相同名称的表.如何找到当前登录用户看到的那个?有没有给它的主人的功能?如果有公共同义词怎么办?

spe*_*593 33

您可以查询ALL_OBJECTS视图:

select owner
     , object_name
     , object_type
  from ALL_OBJECTS
 where object_name = 'FOO'
Run Code Online (Sandbox Code Playgroud)

要查找同义词:

select *
  from ALL_SYNONYMS
 where synonym_name = 'FOO'
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,如果用户用户的SQL语句引用没有模式限定的对象名称(例如'FOO'),Oracle FIRST会检查用户的模式以查找该名称的对象(包括该用户模式中的同义词).如果Oracle无法解析用户架构中的引用,则Oracle会检查公共同义词.

如果您正在寻找特定table_name的约束:

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'
       )
Run Code Online (Sandbox Code Playgroud)

HTH

- 附录:

如果您的用户被授予访问DBA_视图的权限(例如,如果您的用户已被授予SELECT_CATALOG_ROLE),则可以在前面的SQL示例中替换" DBA_'代替' ALL_'.该ALL_x观点只显示你已经授予的权限对象.该DBA_x意见将显示所有数据库对象,你是否对他们还是不特权.


ent*_*erd 7

我在谷歌搜索如何在 Oracle 中查找表的所有者时发现这个问题是最重要的结果,所以我想我会为其他人提供一个特定于表的答案以方便其他人。

要查找 Oracle 数据库中特定表的所有者,请使用以下查询:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>';
Run Code Online (Sandbox Code Playgroud)