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

时间:2009-06-03 20:47:01

标签: oracle

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

5 个答案:

答案 0 :(得分:33)

您可以查询ALL_OBJECTS视图:

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

查找同义词:

select *
  from ALL_SYNONYMS
 where synonym_name = 'FOO'

只是澄清一下,如果 user 用户的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'
       )

HTH

- 附录:

如果您的用户被授予访问DBA_视图的权限(例如,如果您的用户已被授予SELECT_CATALOG_ROLE),则可以在前面的SQL示例中替换“DBA_”代替“ALL_”。 ALL_x视图仅显示您已被授予权限的对象。 DBA_x视图将显示所有数据库对象,无论您是否拥有它们的权限。

答案 1 :(得分:2)

有趣的问题 - 我认为没有任何Oracle函数可以执行此操作(几乎就像Unix中的“which”命令),但您可以通过以下方式获取名称的解析顺序:

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')

答案 2 :(得分:1)

要在Oracle会话中查找当前用户的名称,请使用USER函数。

请注意,约束的所有者,包含外键的表的所有者以及引用的表的所有者可能都不同。这听起来像是你感兴趣的桌主,在这种情况下,这应该接近你想要的:

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

答案 3 :(得分:1)

ALL_TABLES和ALL_CONSTRAINTS等Oracle视图都有一个所有者列,您可以使用该列来限制查询。这些表的变体也以USER而不是ALL开头,它们只列出当前用户可以访问的对象。

these次观看之一应有助于解决您的问题。对于类似的问题,他们总是对我很好。

答案 4 :(得分:1)

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

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

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