1

我的服务器上有一个用于交易的公共同义词:但是我希望能够使用我自己的本地版本的表,以免打扰其他用户。

Oracle 的 SQL 是否以可预测的方式解决了这样的命名冲突?

换句话说,如果另一个用户创建了一个名为的公共同义词TRANSACTION,我这样做:

CREATE TABLE TRANSACTION (

ID NUMBER

);

当我写

select * from TRANSACTION

我是否可以保证 Oracle 将始终解析同义词或我的本地表?

(我知道我可以在技术上指定schema.TRANSACTION强制问题,但在我的情况下,这需要我修改/重建应用程序,我希望节省一些工作。)

4

1 回答 1

4

您对名称解析的理解是正确的。Oracle 将首先在当前模式中查找具有该名称的对象。因此,如果发生冲突,它将选择当前模式中的一个对象,而不是公共同义词所引用的对象。

http://docs.oracle.com/cd/B28359_01/server.111/b28310/general008.htm

Oracle 数据库尝试限定 SQL 语句中引用的名称的第一部分。例如,在 scott.emp 中,scott 是第一部分。如果只有一件,那一件被认为是第一件。

在当前模式中,数据库搜索名称与对象名称的第一部分匹配的对象。如果没有找到这样的对象,则继续执行步骤 b。

数据库搜索与名称的第一部分匹配的公共同义词。如果没有找到,则继续执行步骤c。

数据库搜索名称与对象名称的第一部分匹配的模式。如果它找到一个,它返回到步骤 b,现在使用名称的第二部分作为在限定模式中查找的对象。如果第二个片段与先前限定的模式中的对象不对应,或者没有第二个片段,则数据库返回错误。

如果在步骤 c 中没有找到模式,则无法限定对象并且数据库返回错误。

话虽如此,这是公共同义词的问题之一。拥有这样的对象会导致开发和支持的混乱。在这两种情况下,您最好通过所有者和名称引用对象

于 2013-02-11T14:50:24.513 回答