【问题标题】:Referencing same table name in different schemas在不同的模式中引用相同的表名
【发布时间】:2010-09-07 11:17:59
【问题描述】:

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

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

【问题讨论】:

    标签: .net sql oracle


    【解决方案1】:

    这似乎是名称解析的问题,请尝试在表上创建一个公共同义词:

    MyTempTable创建公共同义词MyTempTable

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


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

    【讨论】:

    • DBA 不赞成公共同义词,因为这意味着数据库不能用于其他用途。
    • 是的,但是通过使用公共同义词,数据库可以更轻松地支持具有不同程度的对象访问权限的多个用户和角色配置文件。就我而言,如果您需要有多个模式中存在的表名,那么设计中就会出现问题。 Oracle 支持行级安全性和虚拟私有数据库的概念,因此这不是必需的。
    【解决方案2】:

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

    ALTER SESSION SET CURRENT_SCHEMA=abc;
    

    其中 abc 是拥有表的用户。

    【讨论】:

      【解决方案3】:

      对于初学者,我建议您使用 Oracle 的 .net 数据提供程序 - 如果可能的话。如果您从一个项目开始,这将是让您进一步避免痛苦的最佳方式。你可以从here得到它们

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          尝试添加

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

          在连接字符串中。

          【讨论】:

            猜你喜欢
            • 2013-12-19
            • 2021-02-13
            • 1970-01-01
            • 1970-01-01
            • 2020-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多