Postgresql ошибка ссылки между базами не реализованы

I am trying to convert SQL inner join query into PostgreSQL inner join query. In this inner join query which tables are using that all tables are not present in one database. we separated tables into two databases i.e. application db and security db

  1. users and permission table are present in security db
  2. userrolemapping and department are present in application db

I tried like below but I am getting following error

Error

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

SQL Stored Function

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 Stored Function

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;

Braiam's user avatar

asked Aug 10, 2018 at 10:52

SpringUser's user avatar

1

You cannot join tables from different databases.

Databases are logically separated in PostgreSQL by design.

If you want to join the tables, you should put them into different schemas in one database rather than into different databases.

Note that what is called “database” in MySQL is called a “schema” in standard SQL.

If you really need to join tables from different databases, you need to use a foreign data wrapper.

answered Aug 10, 2018 at 12:43

Laurenz Albe's user avatar

Laurenz AlbeLaurenz Albe

202k17 gold badges190 silver badges247 bronze badges

8

For future searchs, you can to use dblink to connect to other database.

Follow commands:

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);

answered Jul 22, 2020 at 11:58

rafaelnaskar's user avatar

New to postrgreSQL and I had the same requirement. FOREIGN DATA WRAPPER did the job.

IMPORT FOREIGN SCHEMA — import table definitions from a foreign server

But first I had to:

  1. enable the fdw extension

  2. define the foreign server (which was the locahost in this case!)

  3. create a mapping between the local user and the foreign user.

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;

After that I could use the foreign tables as if they were local. I did not notice any performance cost.

Jeremy Caney's user avatar

Jeremy Caney

7,00461 gold badges48 silver badges76 bronze badges

answered Dec 6, 2021 at 20:40

Antony Economou's user avatar

In my case, I changed my query from:

SELECT * FROM myDB.public.person

to this:

SELECT * FROM "myDB".public.cats

and it worked.

You can read more at mathworks.com.

Timothy Alexis Vass's user avatar

answered Feb 20, 2022 at 9:57

Behnam's user avatar

BehnamBehnam

9912 gold badges14 silver badges38 bronze badges

Есть таблица artist и user_artist

artist:
- id (PK)
- name
user_artist:
- id (PK)
- userId(FK)
- artistId(FK)
- added

Следующий запрос возвращает ошибку

ссылки между базами не реализованы: user_artist.added

return db.query(`
                SELECT artist.name  AS "artistName", artist.id AS "artistId", user_artist.added
                FROM user_artist
                INNER JOIN artist
                ON artist.id = user_artist."artistId"
                WHERE user_artist."userId" = $(userId) 
                AND user_artist.added::timestamp < to_timestamp($(index) / 1000)
                ORDER BY user_artist.added $(order)
                LIMIT $(limit);`, obj);

Если убрать ORDER BY user_artist.added $(order) то ошибка исчезает.
Вот точная структура таблица user_artist

create table user_artist
(
  "id" serial primary key,
  "userId" serial REFERENCES user (id) on delete cascade,
  "artistId" serial REFERENCES artist (id) on delete cascade,
  "added" timestamp,
  unique ("userId", "artistId")
);

Что не так?

Студворк — интернет-сервис помощи студентам

Здравствуйте, такая проблема, у меня есть задание :В базе данных basa1 имеется таблица Книга. Из базы данных basa2 необходимо выполнить действие по увеличению цены всех книг на 10%. В какой базе данных должна быть создана процедура и как можно ее выполнить?
Под это дело я написала нечто такое:

SQL
1
2
3
4
5
CREATE PROCEDURE my_proc4() AS $$
BEGIN
UPDATE basa1.dbl.Книга SET basa1.dbl.Книга.Цена =basa1.dbl.Книга.Цена*1.1 ;
END
$$ LANGUAGE 'plpgsql'

процедура создается, но когда пытаюсь ее вызвать пишет «ссылки между базами не реализованы: «basa1.dbl.Книга»»
как можно это исправить?
p.s. данный вариант составления процедуры не первый, и если раньше он эту процедуру даже заметить ее, то сейчас хоть понятно в чем проблема
p.s. p.s. Надеюсь код я занесла в правильные скобки

Вы получаете эту ошибку, потому что вы не подключены к базе данных real_estate.

Я предполагаю, что вы подключены к postgres, потому что это то, что вы обычно делаете для запуска CREATE DATABASE.

Вам нужно будет разорвать существующее соединение с базой данных, а затем запустить его для вновь созданной базы данных. Только тогда вам разрешено создавать объекты в базе данных.

Это особенность, что разные базы данных строго разделены, и любой запрос на изменение, который будет отклонен.

Как это лучше всего сделать, зависит от того, как вы запускаете сценарий. Если вы запустите его с psql, подойдет простой c real_estate.

Я пытаюсь преобразовать запрос внутреннего соединения 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;

4 ответа

Вы не можете соединять таблицы из разных баз данных.

Базы данных логически разделены в PostgreSQL.

Если вы хотите соединить таблицы, вы должны поместить их в разные схемы в одной базе данных, а не в разные базы данных.

Обратите внимание, что то, что называется «базой данных» в MySQL, называется «схемой» в стандартном SQL.

Если вам действительно нужно объединить таблицы из разных баз данных, вам нужно использовать стороннюю оболочку данных.


29

Laurenz Albe
8 Янв 2019 в 10:09

Для будущих поисков вы можете использовать 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);


6

rafaelnaskar
22 Июл 2020 в 14:58

У меня была такая же проблема с Postgres и JpaRepo, и я просто удалил dbname.public из запроса.


0

Krizsán Balazs
19 Авг 2021 в 19:43

Новичок в postrgreSQL, и у меня было такое же требование. FOREIGN DATA WRAPPER сделал свое дело.

IMPORT FOREIGN SCHEMA — импорт определений таблиц с внешнего сервера.

Но сначала мне нужно было:

  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;

После этого я мог использовать чужие таблицы, как если бы они были локальными. Затрат на производительность я не заметил.


0

Jeremy Caney
7 Дек 2021 в 03:33

Понравилась статья? Поделить с друзьями:
  • Postgresql ошибка роль не существует
  • Postgresql ошибка при установке на windows 10
  • Postgresql ошибка подключения к тестовому сетевому сокету 10013
  • Postgresql ошибка ошибочный литерал массива
  • Postgresql ошибка операции администрирования