在不同的模式中引用相同的表名

3

我在一个基于.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

如果我运行以下查询,则会得到错误的结果(这里的错误结果意味着不正确的数据。该数据不属于我的数据库):
SELECT ID, NAME  
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)

但如果我附加数据库名称,它就会给出正确的结果:
SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)

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

5个回答

2

连接到数据库时出现问题。

ALTER SESSION SET CURRENT_SCHEMA=abc;

其中 abc 是拥有这些表的用户。


2
这似乎是一个名称解析问题,请尝试在表上创建一个公共同义词:
CREATE PUBLIC SYNONYM MyTempTable for MyTempTable;
此外,您所说的“错误结果”具体指什么,不正确的数据、错误信息?
编辑:所需表所属模式的名称是什么?听起来你正在尝试从不同模式的表中进行选择,而连接的用户所属的模式与之不同。

公共同义词被数据库管理员所不赞成,因为这意味着数据库不能用于其他用途。 - Gary Myers
是的,然而通过使用公共同义词,数据库可以更轻松地支持具有不同访问权限的多个用户和角色配置文件。就我而言,如果您需要在多个模式中存在相同的表名,则设计存在问题。Oracle支持行级安全性和虚拟专用数据库的概念,因此不应该需要这样做。 - stjohnroe

1
首先,我建议您尽可能使用来自Oracle的 .net 数据提供程序。如果您在项目中刚开始使用它们,这将是最好的方法,以避免后续痛苦。您可以从这里获取它们。

1

为了进一步解释stjohnroe所说的,看起来你得到不同结果的原因是因为存在于不同模式下具有相同名称的两个表。
通过在查询前添加myDB用户名,现在您可以访问包含您期望数据的表格。 (由于您说数据不属于“myDB”,这可能意味着编写数据的应用程序/过程也将数据写入错误的表格)。
解决方案如下:
1. 如果该表确实不属于“myDB”,则出于整洁考虑,请删除它(现在运行代码时可能会出现904表未找到错误)
2. 创建一个同义词以访问您真正想要访问的模式和表(例如CREATE SYNONYM myTable FOR aschema.myTable;)
3. 不要忘记从拥有该表的模式授予访问权(例如:GRANT SELECT,INSERT,DELETE ON myTable TO myDB;(这里myDB指用户/模式))


0

尝试添加

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

在连接字符串中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接