我的服务器上有一个用于事务的公共同义词:但是我希望能够使用我自己的本地版本的表,以免打扰其他用户。
Oracle 的 SQL 是否能够以可预测的方式解决此类命名冲突?
换句话说,如果另一个用户创建了一个名为 的公共同义词,TRANSACTION我会这样做:
CREATE TABLE TRANSACTION (
ID NUMBER
);
Run Code Online (Sandbox Code Playgroud)
当我写作时
select * from TRANSACTION
Run Code Online (Sandbox Code Playgroud)
我能否保证 Oracle 始终能够解析同义词或我的本地表?
(我知道我可以在技术上指定schema.TRANSACTION强制解决该问题,但就我而言,这需要我修改/重建应用程序,我希望节省一些工作。)
您对名称解析的理解是正确的。Oracle 将首先在当前模式中查找具有该名称的对象。因此,如果发生冲突,它将选择当前模式中的对象,而不是公共同义词引用的对象。
http://docs.oracle.com/cd/B28359_01/server.111/b28310/general008.htm
Oracle 数据库尝试限定 SQL 语句中引用的名称的第一部分。例如,在 scott.emp 中,scott 是第一块。如果只有一件,则该一件被视为第一件。
在当前模式中,数据库搜索名称与对象名称的第一部分匹配的对象。如果它没有找到这样的对象,则继续步骤b。
数据库搜索与名称的第一部分匹配的公共同义词。如果没有找到,则继续执行步骤 c。
数据库搜索名称与对象名称的第一部分匹配的模式。如果找到,则返回到步骤 b,现在使用名称的第二部分作为要在限定模式中查找的对象。如果第二个片段与先前限定的模式中的对象不对应或者不存在第二个片段,则数据库返回错误。
如果在步骤 c 中未找到架构,则无法限定该对象,并且数据库将返回错误。
话虽如此,这是公共同义词的问题之一。拥有这样的对象会导致开发和支持方面的混乱。在这两种情况下,您最好通过所有者和名称引用对象