postgresql 未实现跨数据库引用:

qcbq4gxm  于 2023-01-05  发布在  PostgreSQL
关注(0)|答案(4)|浏览(788)

我正在尝试将SQL内部连接查询转换为PostgreSQL内部连接查询。在此内部连接查询中,哪些表正在使用,所有表不存在于一个数据库中。我们将表分为两个数据库,即应用程序数据库和安全数据库
1.安全数据库中存在用户和权限表
1.应用程序数据库中存在用户角色Map和部门
我尝试了如下操作,但出现以下错误

    • 错误**
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;
yyyllmsg

yyyllmsg1#

不能联接来自不同数据库的表。
PostgreSQL中的数据库在设计上是逻辑分离的。
如果要联接表,则应将它们放入一个数据库中的不同架构中,而不是放入不同的数据库中。
注意,MySQL中所谓的“数据库”在标准SQL中称为“模式”。
如果确实需要连接来自不同数据库的表,则需要使用外部数据 Package 器。

lvmkulzt

lvmkulzt2#

为了将来的搜索,你可以使用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);
v440hwme

v440hwme3#

刚接触postrgreSQL的我和我有同样的要求。外国数据 Package 器完成了这项工作。
IMPORT FOREIGN SCHEMA — import table definitions from a foreign server
但首先我必须:
1.启用fdw扩展
1.定义外部服务器(在本例中是本地主机!)
1.创建本地用户和外部用户之间的Map。

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;

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

d6kp6zgx

d6kp6zgx4#

在我的案例中,我将查询从:

SELECT * FROM myDB.public.person

改为:

SELECT * FROM "myDB".public.cats

而且奏效了。
你可以在mathworks.com上阅读更多信息。

相关问题