【问题标题】:Name resolution of tables with similar name while querying查询时同名表的名称解析
【发布时间】:2017-05-22 18:43:52
【问题描述】:

我在 Oracle 中有 3 个架构:

  1. 让我们假设 A 和 B 有一个同名的表:-比如说表 X
  2. 我已从两个表中授予表 X 上模式 C 的选择权限。
  3. 现在,如果我在模式 C 中写入 select * from X。

它将使用哪个表从 X 模式 A 或模式 B 中进行选择???

【问题讨论】:

  • 或者......如果你还没有做任何其他事情,也没有。当你尝试时会发生什么?您是否在查询的会话中创建了任何同义词,或更改了 C 的当前架构?
  • 为什么不在 SELECT 中使用显式模式名称,例如 A.X?
  • 如果您处于这种可能会混淆的情况,那么只需使用您感兴趣的模式名称来限定表名。
  • 是的,但是代码已经写成 select * from X;在 prod 中,它自动采用了其中一个模式。直到那时我才意识到它采用了错误的模式。我将更改代码并将其用作 select * from A.X 或 select from B.X 根据需要。但我将其发布到只需知道是否有人知道 Oracle 是如何找到它的……………………………………………………………… ....基本上这是与架构相关的问题,而不是与编码相关的问题。
  • 那么您可能已经有一个同义词(C 的私有或公共)指向其中一个;或者您当前的架构可能正在自动更改。

标签: oracle


【解决方案1】:

它将使用哪个表从 X 模式 A 或模式 B 中进行选择???

都没有。

在您刚刚将SELECT 权限授予C 的情况下:

select * from X

将导致

ORA-00942: table or view does not exist.

您需要使用架构限定查询:

select * from A.X

select * from B.X

或者你需要创建一个同义词:

CREATE SYNONYM X FOR B.X;

那么select * from X 将使用B 架构中的表X

【讨论】:

  • 我也是这么认为的,但这是一个有趣的事实。当我从表中查询时
  • 从 X 中选择 *
  • 它让我从 A.X 中选择 *
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多