假设我的数据库具有以下对象:
所有这些对象都被授予我的模式“ RedSoxRule”
如果我执行此查询,将从何处检索数据?
SELECT *
FROM mlb_players
换句话说,如果给定名称(在这种情况下为“ mlb_players”)适用于不同的对象类型,并且GRANTS相等,那么Oracle将以什么顺序找到请求的对象?
答案 0 :(得分:3)
Oracle has a nice long explanation of this。
基本上,解析名称时,它看起来是:
C.mlb_players
,则会检查名称的第一部分是否是您可以访问的合格架构。在您的示例中,Oracle找不到任何一个。它们都与您的RedSoxRule
模式处于不同的模式,它们都不是公共同义词,并且您没有使用模式名称来限定mlb_players
。
对象的类型(表,视图,同义词,包等)实际上并不重要-它们被相同地对待。
答案 1 :(得分:2)
如果执行此查询,将从何处检索数据
无处。 REDSOXRULE没有名为mlb_players
的对象,因此查询将失败,并显示ORA-00942: table or view does not exist
。
您需要在表名前加上要前缀的模式,例如
SELECT *
FROM d.mlb_players;
假设您的发布结构有所不同。
mlb_players
的视图a.mlb_players
。查询select * from mlb_players
将从此视图中进行选择,即从a.mlb_players
中进行选择。mlb_players
的专用同义词b.mlb_players
而不是视图。查询select * from mlb_players
将从此同义词中进行选择,即从b.mlb_players
中进行选择。请注意,您的架构中不能有与表或视图同名的私有同义词。mlb_players
的公共同义词d.mlb_players
,而不是私有同义词。查询select * from mlb_players
将从此公共同义词中进行选择,即从d.mlb_players
中进行选择。也就是说,Oracle首先寻找该模式拥有的对象(表,视图,专用同义词等)。然后,它查看公共同义词。然后它会在其他模式中查找对象