복붙노트

[SQL] PostgreSQL을 함께 데이터베이스 간 쿼리를 수행 할 수?

SQL

PostgreSQL을 함께 데이터베이스 간 쿼리를 수행 할 수?

나는 PostgreSQL을을 사용하여 데이터베이스 간 쿼리를 수행 어쨌든 거기 대답은 "NO"오류 아래 메시지 (이 구글 결과)에 근거없는 추측하려고하지만거야?

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

나는 데이터가 정말 (다른 데이터베이스의 사용자 테이블에서 온 하나의 데이터베이스에서 사용자 ID 열) 두 공유하고 있지만 두 데이터베이스에 걸쳐 분할되어 일부 데이터와 함께 일하고 있어요. 나는이 대신 스키마의 두 개의 별도의 데이터베이스가 왜 아무 생각이 없지만, 셀라 VIE ...

해결법

  1. ==============================

    1.참고 : 당신은 아마 대신 두 개의 스키마를 만들고 싶어 같은 시스템에 두 개의 데이터베이스를 설정하는 경우 원래 아스 커는 묵시적으로 - 당신이 그들에 걸쳐 쿼리에 아무것도 특별한 필요하지 않는 경우.

    참고 : 당신은 아마 대신 두 개의 스키마를 만들고 싶어 같은 시스템에 두 개의 데이터베이스를 설정하는 경우 원래 아스 커는 묵시적으로 - 당신이 그들에 걸쳐 쿼리에 아무것도 특별한 필요하지 않는 경우.

    사용 postgres_fdw (해외 데이터 래퍼) 어떤 포스트 그레스 데이터베이스의 테이블에 연결 - 로컬 또는 원격.

    다른 인기있는 데이터 소스에 대한 외부 데이터 래퍼가 주 있음. 이때 만 postgres_fdw 및 file_fdw 공식 포스트 그레스 분포의 일부입니다.

    이 오래된 버전은 더 이상 지원되지 않습니다,하지만 당신은 사전에 2013 년 포스트 그레스 설치에서이 작업을 수행해야하는 경우, DBLINK라는 함수가있다.

    나는 그것을 사용한 적이 있지만, 유지과 PostgreSQL의 나머지와 함께 배포된다. 당신이 당신의 리눅스 배포판과 함께 제공의 PostgreSQL의 버전을 사용하는 경우, 당신은 PostgreSQL을-있는 contrib라는 패키지를 설치해야 할 수도 있습니다.

  2. ==============================

    2.당신 같은 크로스 데이터베이스 쿼리에 대한 같은 결론에 오기 전에 나는이로 실행했다. 나는 방법 나는 그룹화 된 테이블을 유지할 수있는 테이블 공간을 분할하지만 여전히 그들 모두를 조회 할 스키마를 사용하던 일을 결국 무엇.

    당신 같은 크로스 데이터베이스 쿼리에 대한 같은 결론에 오기 전에 나는이로 실행했다. 나는 방법 나는 그룹화 된 테이블을 유지할 수있는 테이블 공간을 분할하지만 여전히 그들 모두를 조회 할 스키마를 사용하던 일을 결국 무엇.

  3. ==============================

    3.좋은 예 중 하나

    좋은 예 중 하나

    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;
    

    참고 : 나는 미래의 참조를 위해이 정보를 제공하고 있습니다. 참고

  4. ==============================

    4.그냥 좀 더 정보를 추가 할 수 있습니다.

    그냥 좀 더 정보를 추가 할 수 있습니다.

    PostgreSQL의 자주 묻는 질문

  5. ==============================

    5.예, 당신은 DBLINK (PostgreSQL을 만 해당) 및 DBI-링크를 사용하여 (외국 간 데이터베이스 queriers을 허용) 할 수 있으며 쿼리를 수 TDS_LInk는 MS SQL 서버에 대해 실행할 수 있습니다.

    예, 당신은 DBLINK (PostgreSQL을 만 해당) 및 DBI-링크를 사용하여 (외국 간 데이터베이스 queriers을 허용) 할 수 있으며 쿼리를 수 TDS_LInk는 MS SQL 서버에 대해 실행할 수 있습니다.

    나는 큰 성공을하기 전에 DB-링크와 TDS-링크를 사용했다.

  6. ==============================

    6.성능이 중요하며, 대부분의 질의가있는 경우 읽기 전용, 나는 다른 데이터베이스에 걸쳐 복제 데이터에 건의 할 것입니다. 이 데이터의 불필요한 중복처럼 보이지만 인덱스가 필요한 경우, 그것은 도움이 될 수 있습니다.

    성능이 중요하며, 대부분의 질의가있는 경우 읽기 전용, 나는 다른 데이터베이스에 걸쳐 복제 데이터에 건의 할 것입니다. 이 데이터의 불필요한 중복처럼 보이지만 인덱스가 필요한 경우, 그것은 도움이 될 수 있습니다.

    이 차례로 호출에서 다른 복사본을 업데이트 DBLINK 삽입 트리거에 간단하게 수행 할 수 있습니다. 완전한 복제 (Slony 같은) 옵션하지만의 주제에서 벗어난도 있습니다.

  7. ==============================

    7.경우 누군가가 데이터베이스 간 쿼리를 수행하는 방법에 대한 더 복잡 예를 필요에서, 여기에 예입니다 그것이이있는 모든 데이터베이스에 databasechangeloglock 테이블 정리 :

    경우 누군가가 데이터베이스 간 쿼리를 수행하는 방법에 대한 더 복잡 예를 필요에서, 여기에 예입니다 그것이이있는 모든 데이터베이스에 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
    $$
    
  8. ==============================

    8.나는 확인하고 DBLINK 및 postgres_fdw하지만 결과를 모두 사용하여 2 개의 다른 데이터베이스의 두 테이블 사이에 외래 키 관계를 만들기 위해 노력했다.

    나는 확인하고 DBLINK 및 postgres_fdw하지만 결과를 모두 사용하여 2 개의 다른 데이터베이스의 두 테이블 사이에 외래 키 관계를 만들기 위해 노력했다.

    여기와 여기에 예를 들어,이에 대한 다른 사람들의 의견을 읽고 보이는 다른 소스에서 현재 해당 작업을 수행 할 수있는 방법이없는 것처럼 데 :

    DBLINK 실제로 표준 포스트 그레스 불가능 다른 데이터베이스에 및 쿼리 테이블을 연결하는 일을 가능하게하지만, 서로 다른 데이터베이스의 테이블 사이의 외래 키 관계를 구축하는 것을 허용하지 않습니다 postgres_fdw.

  9. from https://stackoverflow.com/questions/46324/possible-to-perform-cross-database-queries-with-postgresql by cc-by-sa and MIT license