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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我想查找表的外键,但可能会有多个用户/模式具有相同名称的表。我如何找到当前登录的用户正在看到的那个?如果有公共同义词呢?

提问于
用户回答回答于

有趣的问题--我不认为有任何Oracle函数会这样做(几乎像Unix中的“Win”命令),但是你可以通过以下方式获得名称的解析顺序:

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')
用户回答回答于

可以查询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会检查公有同义词。

如果正在专门查找特定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'
       )

扫码关注云+社区