IT

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

lottoking 2020. 7. 4. 10:03
반응형

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


아래 오류 메시지 (및 이 Google 결과 )를 기반으로 대답이 "아니오"라고 생각 하지만 PostgreSQL을 사용하여 데이터베이스 간 쿼리를 수행해야합니까?

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

데이터가 실제로 두 데이터베이스간에 공유되지만 두 데이터베이스간에 파티션 된 일부 데이터로 작업하고 있습니다 (한 데이터베이스의 사용자 열은 다른 데이터베이스의 users테이블에서 나옵니다 ). 왜 이것이 스키마 대신 두 개의 별도 데이터베이스인지 모르겠지만 c'est la vie ...


참고 : 원래 질문에서 알 수 있듯이 동일한 머신에 두 개의 데이터베이스를 설정 하는 경우 대신 두 개의 스키마 를 작성하려고 할 수 있습니다.이 경우 데이터베이스 를 쿼리하는 데 특별한 것이 필요하지 않습니다.

9.3 기준으로 업데이트

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

이 참고 것을 다른 인기있는 데이터 소스에 대한 외부 데이터 래퍼 . 이 때, 단지 postgres_fdwfile_fdw공식 포스트 그레스 분포의 일부입니다.

9.3 이전의 원래 답변

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

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


교차 데이터베이스 쿼리에 대해 동일한 결론을 내리기 전에이 문제를 해결했습니다. 내가 한 일은 테이블을 그룹화 할 수는 있지만 스키마를 모두 쿼리 할 수있는 방식으로 스키마를 사용하여 테이블 스페이스를 나누는 것이 었습니다.


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

dblink는 원격 데이터베이스에서 쿼리 (일반적으로 SELECT이지만 행을 반환하는 모든 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는 함수 호출을 사용하여 데이터베이스 간 쿼리를 허용합니다. 물론 클라이언트는 다른 데이터베이스에 동시에 연결하여 결과를 클라이언트쪽에 병합 할 수도 있습니다.

PostgreSQL FAQ


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

나는 큰 성공을 거두기 전에 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
$$

dblinkpostgres_fdw를 사용하여 2 개의 다른 데이터베이스에서 2 개의 테이블 사이에 외래 키 관계를 확인하려고했지만 결과가 없습니다.

Having read the other peoples feedback on this, for example here and here and in some other sources it looks like there is no way to do that currently:

The dblink and postgres_fdw indeed enable one to connect to and query tables in other databases, which is not possible with the standard Postgres, but they do not allow to establish foreign key relationships between tables in different databases.

참고URL : https://stackoverflow.com/questions/46324/possible-to-perform-cross-database-queries-with-postgresql

반응형