【问题标题】:SELECT data from another schema in oracle从 oracle 中的另一个模式中选择数据
【发布时间】:2012-11-22 10:45:44
【问题描述】:

我想执行一个查询,该查询从与数据库连接中指定的模式不同的模式中选择数据(相同的 Oracle 服务器、相同的数据库、不同的模式)

我有一个 python 应用程序与 Oracle 服务器通信。它打开与数据库(服务器/模式)A 的连接,并对该数据库内的表执行选择查询。

我尝试了以下方法:

select .... 
from pct.pi_int, pct.pi_ma, pct.pi_es
where ...

但我明白了:

ORA-00942: table or view does not exist

我也试过用括号括起来架构名称:

from [PCT].pi_int, [PCT].pi_ma, [PCAT].pi_es

我明白了:

ORA-00903: invalid table name

查询是使用 Django 应用程序内部的 cx_Oracle python 模块执行的。

可以这样做还是我应该建立一个新的数据库连接?

【问题讨论】:

  • 出于好奇,在 Python 中尝试此语句之前,您是否曾在 Toad 或 SQL Developer 中尝试过?
  • 在 Oracle 术语中,数据库是数据文件的集合。听起来您想从同一数据库中的不同架构中选择数据,这就是我编辑您的问题以反映的内容。 Oracle 所称的“模式”类似于许多其他 RDBMS 产品所称的“数据库”。如果你的意思是服务器上有两个数据库,并且你想连接到数据库 A 并查询数据库 B 上的表,那是可能的,但是你需要在解决方案中添加一个数据库链接。
  • 没错,我的意思是两个模式。
  • 我使用 python shell 尝试了这个和其他查询,并且所有其他查询都有效。
  • [] 是 (ANSI) SQL 标识符的无效字符。

标签: sql oracle cx-oracle


【解决方案1】:

您用来连接数据库的用户(本例中为用户A)是否对PCT 架构中的对象具有SELECT 访问权限?假设A 没有此访问权限,您将收到“表或视图不存在”错误。

很可能,您需要您的 DBA 授予用户 A 访问您需要的 PCT 架构中的任何表的权限。类似的东西

GRANT SELECT ON pct.pi_int
   TO a;

完成后,您应该能够使用语法 pct.pi_int 引用 PCT 架构中的对象,正如您最初在问题中演示的那样。括号语法方法将不起作用。

【讨论】:

  • 如果有一个 select 语句可以显示 PCT 授予的授权,那就太好了。
【解决方案2】:

根据您用于连接数据库的架构/帐户,我怀疑您缺少对用于连接数据库的帐户的授权。

在数据库中连接为 PCT 帐户,然后授予您正在使用的帐户对表的选择访问权限。

grant select on pi_int to Account_used_to_connect

【讨论】:

    【解决方案3】:

    除了授权之外,您还可以尝试创建同义词。它将避免每次都指定表所有者架构的需要。

    来自连接架构:

    CREATE SYNONYM pi_int FOR pct.pi_int;
    

    然后可以查询pi_int为:

    SELECT * FROM pi_int;
    

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多