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