【问题标题】:cross-database references are not implemented:未实现跨数据库引用:
【发布时间】:2019-01-17 23:23:33
【问题描述】:

我正在尝试将 SQL 内连接查询转换为 PostgreSQL 内连接查询。在这个内部连接查询中,哪些表正在使用,所有表都不存在于一个数据库中。我们将表分成两个数据库,即应用程序数据库和安全数据库

  1. 用户和权限表存在于安全数据库中
  2. 用户角色映射和部门存在于应用程序数据库中

我尝试如下,但出现以下错误

错误

ERROR:  cross-database references are not implemented: "Rockefeller_ApplicationDb.public.userrolemapping"
LINE 4:         INNER JOIN "Rockefeller_ApplicationDb".public.userro..

SQL 存储函数

SELECT   Department.nDeptID 
    FROM Users INNER JOIN Permission 
         ON Users.nUserID = Permission.nUserID INNER JOIN UserRoleMapping
         ON Users.nUserID = UserRoleMapping.nUserID INNER JOIN Department
         ON Permission.nDeptInst = Department.nInstID
         AND  Department.nInstID = 60
    WHERE     
         Users.nUserID = 3;

PostgreSQL 存储函数

SELECT dep.ndept_id 
        FROM "Rockefeller_SecurityDb".public.users as  u 
        INNER JOIN  "Rockefeller_SecurityDb".public.permissions p ON u.nuser_id = p.nuser_id
        INNER JOIN "Rockefeller_ApplicationDb".public.userrolemapping as urm ON u.nuser_id = urm.nuser_id
        INNER JOIN "Rockefeller_ApplicationDb".public.department dep ON p.ndept_inst = dep.ninst_id
           AND  dep.ninst_id = 60
                        WHERE     
                            u.nuser_id = 3;

【问题讨论】:

标签: postgresql


【解决方案1】:

您不能连接来自不同数据库的表。

在 PostgreSQL 中,数据库在设计上在逻辑上是分开的。

如果你想连接这些表,你应该把它们放到一个数据库中的不同模式中,而不是放到不同的数据库中。

请注意,MySQL 中所谓的“数据库”在标准 SQL 中称为“模式”。

如果你真的需要连接来自不同数据库的表,你需要使用外部数据包装器。

【讨论】:

  • 意味着你说我们不能加入两个不同数据库中的两个表。如果它是一个 db 和两个不同的模式,那么我们可以执行 join
  • 但要求是两个分开的数据库并加入。没有办法做到这一点
  • 更改要求。如果客户太固执而无法听取好的建议,请使用带有 postgres_fdw 的外部表。
  • @springuser 在 mysql 中也没有办法做到这一点。
  • 哇。我一直在同一台服务器上进行跨数据库连接!我很震惊 mysql 和 postgres 不允许这样做。
【解决方案2】:

为了以后的搜索,您可以使用dblink连接到其他数据库。

按照命令:

create extension dblink;

SELECT dblink_connect('otherdb','host=localhost port=5432 dbname=otherdb user=postgres password=???? options=-csearch_path=');

SELECT * FROM dblink('otherdb', 'select field1, field2 from public.tablex')
AS t(field1 text, field2 text);

【讨论】:

    【解决方案3】:

    我在使用 Postgres 和 JpaRepo 时遇到了同样的问题,我刚刚从查询中删除了 dbname.public

    【讨论】:

      【解决方案4】:

      postrgreSQL 新手,我也有同样的要求。 FOREIGN DATA WRAPPER 完成了这项工作。

      IMPORT FOREIGN SCHEMA — import table definitions from a foreign server

      但首先我必须:

      1. 启用 fdw 扩展

      2. 定义外部服务器(在本例中是本地主机!)

      3. 创建本地用户和外地用户之间的映射。

      CREATE EXTENSION postgres_fdw;
      
      CREATE SERVER localsrv
      FOREIGN DATA WRAPPER postgres_fdw
      OPTIONS (host 'localhost', dbname 'otherdb', port '5432');
      
      CREATE USER MAPPING FOR <local_user>
      SERVER localsrv
      OPTIONS (user 'ohterdb_user', password 'ohterdb_user_password');
      
      IMPORT FOREIGN SCHEMA public
      FROM SERVER localsrv 
      INTO public;
      

      之后,我可以像使用本地表一样使用外部表。我没有注意到任何性能成本。

      【讨论】:

        【解决方案5】:

        就我而言,我将查询更改为:

        SELECT * FROM myDB.public.person
        

        到这里:

        SELECT * FROM "myDB".public.cats
        

        它成功了。

        阅读更多here

        【讨论】:

          猜你喜欢
          • 2019-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-30
          • 1970-01-01
          • 2021-11-24
          • 1970-01-01
          • 2011-04-09
          相关资源
          最近更新 更多