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