在不同的架构中引用相同的表名

时间:2020-03-05 18:46:00  来源:igfitidea点击:

我在基于.net 2.0的Windows应用程序中遇到Oracle查询问题。我正在使用System.Data.OracleClient连接到oracle数据库。数据库名称是" myDB"。在我正在使用的连接字符串下面:

Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST =  172.16.0.24)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = ORCL)));
User ID=myDB;Password=myDB;Unicode=True

如果我运行以下查询,那么它将给我错误的结果(此处错误的结果表示错误的数据。该数据不属于myDB):

SELECT ID, NAME  
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)

但是,如果我将数据库名称与它一起添加,它将给出正确的结果:

SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)

我的限制是我不能添加数据库名称,因为这是一个通用应用程序,并且可以在运行时与任何数据库一起运行。请帮忙。

解决方案

回答

尝试添加

CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)

在连接字符串中。

回答

这看起来像是名称解析问题,请尝试在表上创建公共同义词:

为MyTempTable创建公共SYNONYM MyTempTable;

另外,错误的结果,错误的数据,错误消息到底是什么意思?

编辑:所需表所属的架构的名称是什么?听起来我们试图从中选择的表与属于我们所连接的用户的表处于不同的架构。

回答

首先,我建议我们尽可能使用Oracle的.net数据提供程序。如果我们从一个项目开始,那将是减轻自己痛苦的最好方法。你可以从这里得到

回答

为了进一步解释stjohnroe所说的内容,看起来我们得到不同结果的原因是因为两个具有相同名称的不同表存在于不同的模式中。
通过将myDB用户名添加到查询的前面,我们现在可以使用期望的数据访问该表。 (由于我们说数据不属于" myDB",因此这可能意味着正在写入数据的应用程序/过程也正在向错误的表写入数据)。
解决方法是:
1.如果该表确实不属于" myDB",则为了整洁起见将其删除(现在在运行代码时可能会收到904 table not found错误)
2.为我们真正要访问的架构和表创建同义词(例如,为aschema.myTable创建CREATE SYNONYM myTable;)
3.不要忘记从拥有表的模式中授予访问权限(例如:GRANT SELECT,INSERT,DELETE ON myTable TO myDB;(此处myDB指的是用户/模式))