PostgreSQL로 데이터베이스 간 쿼리를 수행할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/46324

  •  09-06-2019
  •  | 
  •  

문제

아래 오류 메시지를 토대로 대답은 "아니요"라고 추측하겠습니다. 이 Google 검색결과), 하지만 PostgreSQL을 사용하여 데이터베이스 간 쿼리를 수행할 수 있습니까?

databaseA=# select * from databaseB.public.someTableName;
ERROR:  cross-database references are not implemented:
 "databaseB.public.someTableName"

실제로는 두 데이터베이스 간에 데이터가 공유되지만(한 데이터베이스의 사용자 ID 열은 users 다른 데이터베이스의 테이블).왜 이것이 스키마 대신 두 개의 별도 데이터베이스인지는 모르겠지만, c'est la vie...

도움이 되었습니까?

해결책

메모:원래 질문자가 암시했듯이 동일한 머신에 두 개의 데이터베이스를 설정하는 경우 아마도 두 개를 만들고 싶을 것입니다. 스키마 대신 - 이 경우에는 쿼리하기 위해 특별한 것이 필요하지 않습니다.

9.3부터 업데이트

이제 새로운 기능을 사용할 수 있습니다. postgres_fdw (외부 데이터 래퍼) - 로컬 또는 원격 Postgres 데이터베이스의 테이블에 연결합니다.

참고하세요 기타 널리 사용되는 데이터 소스에 대한 외부 데이터 래퍼.이때만 postgres_fdw 그리고 file_fdw 공식 Postgres 배포판의 일부입니다.

9.3 이전에 대한 원래 답변

이 기능은 기본 PostgreSQL 설치의 일부가 아니지만 추가할 수 있습니다.그것은 ~라고 불린다 dblink.

나는 그것을 사용한 적이 없지만 나머지 PostgreSQL과 함께 유지 관리되고 배포됩니다.Linux 배포판과 함께 제공되는 PostgreSQL 버전을 사용하는 경우 postgresql-contrib라는 패키지를 설치해야 할 수도 있습니다.

다른 팁

나는 교차 데이터베이스 쿼리에 대해 당신과 동일한 결론을 내리기 전에 이 문제를 겪었습니다.결국 내가 한 일은 스키마를 사용하여 테이블을 그룹화하면서도 여전히 모두 쿼리할 수 있는 방식으로 테이블 공간을 나누는 것이었습니다.

DB링크() -- 원격 데이터베이스에서 쿼리를 실행합니다.

DBLINK는 원격 데이터베이스에서 쿼리 (일반적으로 선택이지만 행을 반환하는 SQL 문일 수 있음)를 실행합니다.

두 개의 텍스트 인수가 주어지면 첫 번째 인수는 먼저 지속적인 연결 이름으로 올라갑니다.발견되면 해당 연결에서 명령이 실행됩니다.찾을 수없는 경우, 첫 번째 인수는 DBLink_Connect와 같이 연결 정보 문자열로 취급되며, 표시된 연결은이 명령의 지속 시간에만 이루어집니다.

좋은 예 중 하나:

SELECT * 
FROM   table1 tb1 
LEFT   JOIN (
   SELECT *
   FROM   dblink('dbname=db2','SELECT id, code FROM table2')
   AS     tb2(id int, code text);
) AS tb2 ON tb2.column = tb1.column;

메모:나중에 참고할 수 있도록 이 정보를 제공합니다. 참조

조금 더 많은 정보를 추가하면 됩니다.

현재 데이터베이스 이외의 데이터베이스를 쿼리할 수 있는 방법은 없습니다.PostgreSQL은 데이터베이스별 시스템 카탈로그를 로드하기 때문에 데이터베이스 간 쿼리가 어떻게 작동해야 하는지조차 불확실합니다.

contrib/dblink는 함수 호출을 사용하여 데이터베이스 간 쿼리를 허용합니다.물론 클라이언트는 다른 데이터베이스에 동시에 연결하고 클라이언트 측에서 결과를 병합할 수도 있습니다.

포스트그레SQL FAQ

예, DBlink(postgresql만 해당), DBI-Link(외부 교차 데이터베이스 쿼리 허용) 및 MS SQL 서버에 대해 쿼리를 실행할 수 있는 TDS_LInk를 사용하면 가능합니다.

저는 이전에 DB-Link와 TDS-link를 사용해 큰 성공을 거두었습니다.

성능이 중요하고 대부분의 쿼리가 읽기 전용인 경우 데이터를 다른 데이터베이스로 복제하는 것이 좋습니다.이는 불필요한 데이터 중복처럼 보이지만 인덱스가 필요한 경우 도움이 될 수 있습니다.

이는 다른 복사본을 업데이트하기 위해 dblink를 호출하는 간단한 삽입 트리거를 사용하여 수행할 수 있습니다.Slony와 같은 완전한 복제 옵션도 있지만 이는 주제에서 벗어난 것입니다.

데이터베이스 간 쿼리를 수행하는 방법에 대해 더 복잡한 예제가 필요한 경우 다음은 databasechangeloglock 해당 테이블이 있는 모든 데이터베이스의 테이블:

CREATE EXTENSION IF NOT EXISTS dblink;

DO 
$$
DECLARE database_name TEXT;
DECLARE conn_template TEXT;
DECLARE conn_string TEXT;
DECLARE table_exists Boolean;
BEGIN
    conn_template = 'user=myuser password=mypass dbname=';

    FOR database_name IN
        SELECT datname FROM pg_database
        WHERE datistemplate = false
    LOOP
        conn_string = conn_template || database_name;

        table_exists = (select table_exists_ from dblink(conn_string, '(select Count(*) > 0 from information_schema.tables where table_name = ''databasechangeloglock'')') as (table_exists_ Boolean));
        IF table_exists THEN
            perform dblink_exec(conn_string, 'delete from databasechangeloglock');
        END IF;     
    END LOOP;

END
$$
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top