【问题标题】:In what order will Oracle use synonym, view, and table objects?Oracle 将按什么顺序使用同义词、视图和表对象?
【发布时间】:2019-03-28 13:52:46
【问题描述】:

假设我的数据库有以下对象:

  • 架构“B”上名为“mlb_players”的
  • 模式“C”上名为“mlb_players”的视图,它是针对服务器“DB2”上的表的 SELECT
  • 架构“D”上名为“mlb_players”的同义词指向服务器“DB3”上的表

所有这些对象都授予我的模式“RedSoxRule”

如果我执行此查询,将从哪里检索数据?

SELECT *
FROM mlb_players

换句话说,如果给定名称(在本例中为“mlb_players”)适用于不同的对象类型,并且 GRANTS 相等,那么 Oracle 将按什么顺序找到请求的对象?

【问题讨论】:

标签: oracle oracle11g


【解决方案1】:

Oracle has a nice long explanation of this.

基本上,在解析名称时,它看起来:

  1. 对于架构中具有该名称的对象
  2. 对于具有该名称的公共同义词
  3. 如果名称包含多个部分(例如 C.mlb_players,它会检查第一部分是否是您有权访问的合格架构。

在您的示例中,Oracle 不会找到其中任何一个。它们都在与您的 RedSoxRule 架构不同的架构中,它们都不是公共同义词,而且您没有使用架构名称限定 mlb_players

对象的类型(表、视图、同义词、包等)实际上并不重要——它们都被同等对待。

【讨论】:

    【解决方案2】:

    如果我执行此查询,将从哪里检索数据

    无处可去。 REDSOXRULE 没有名为 mlb_players 的对象,因此查询将失败并返回 ORA-00942: table or view does not exist

    您需要在表名前加上您要作为前缀的架构,例如

    SELECT *
    FROM d.mlb_players;
    

    假设您发布的结构有所不同。

    1. REDSOXRULE 对a.mlb_players 有一个视图mlb_players。查询 select * from mlb_players 将从该视图中选择,即从 a.mlb_players 中选择。
    2. REDSOXRULE 有一个私有同义词 mlb_players 来代替视图 b.mlb_players。查询 select * from mlb_players 将从这个同义词中选择,即从 b.mlb_players 中选择。请注意,您的架构中不能有与表或视图同名的私有同义词。
    3. 数据库有一个公共同义词mlb_players 代替私人同义词d.mlb_players。查询 select * from mlb_players 将从这个公共同义词中选择,即从 d.mlb_players 中选择。

    也就是说,Oracle 首先查找模式拥有的对象(表、视图、私有同义词等)。然后它查看公共同义词。然后它在其他模式中寻找对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      相关资源
      最近更新 更多