PostgreSQL로 데이터베이스 간 쿼리를 수행할 수 있습니까?
아래 오류 메시지(및 이 Google 결과)를 바탕으로 "아니오"라는 답을 추측해 보겠습니다. 하지만 PostgreSQL을 사용하여 데이터베이스 간 쿼리를 수행할 수 있는 방법이 있습니까?
databaseA=# select * from databaseB.public.someTableName;
ERROR: cross-database references are not implemented:
"databaseB.public.someTableName"
간에 두 한은 " userid"에서 옵니다).users
다른 데이터베이스에 있는 테이블).왜 스키마 대신에 두 개의 데이터베이스가 있는지 모르겠지만, c'estlavie...
참고: 원래 질문자가 암시했듯이, 동일한 컴퓨터에 두 개의 데이터베이스를 설정하는 경우에는 두 개의 스키마를 대신 만들고 싶을 수 있습니다. 이 경우에는 스키마 전체에 대해 쿼리할 특별한 것이 필요하지 않습니다.
postgres_fdw
(외부 데이터 래퍼)를 사용하여 로컬 또는 원격 Postgres 데이터베이스의 테이블에 연결합니다.
다른 일반적인 데이터 소스에 대한 외부 데이터 래퍼가 있습니다.지금은 오직postgres_fdw
그리고.file_fdw
는 공식 Postgres 배포판의 일부입니다.
Postgres 9.3 이전 버전의 경우
이 이전 버전은 더 이상 지원되지 않지만 2013년 이전 Postgres 설치에서 이 작업을 수행해야 하는 경우라는 기능이 있습니다.
사용해본적은 없지만, Postgre의 나머지 부분과 함께 유지 및 배포됩니다.SQL. Postgre 버전을 사용하는 경우Linux 디스트리뷰터와 함께 제공된 SQL에서는 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은 데이터베이스별 시스템 카탈로그를 로드하기 때문에 데이터베이스 간 쿼리가 어떻게 동작해야 하는지조차 불확실합니다.
contribut/dblink를 사용하면 함수 호출을 사용하여 교차 쿼리를 사용할 수 있습니다.물론 클라이언트는 다른 데이터베이스에 동시에 연결하고 클라이언트 측에서 결과를 병합할 수도 있습니다.
예, DBlink(postgresql만 해당)와 DBI-Link(외부 데이터베이스 쿼리 허용) 및 TDS_LINK를 사용하여 MS SQL 서버에 대해 쿼리를 실행할 수 있습니다.
저는 DB-Link와 TDS-Link를 사용해 본 적이 있습니다.
저는 dblink와 postgres_fdw를 모두 사용하여 2개의 서로 다른 데이터베이스에 있는 2개의 테이블 간의 외부 키 관계를 확인하고 생성하려고 했지만 결과가 없었습니다.
예를 들어 여기, 여기, 그리고 다른 출처에서 이에 대한 다른 사람들의 피드백을 읽어보니 현재로서는 그렇게 할 방법이 없는 것 같습니다.
dblink 및 postgres_fdw를 사용하면 다른 데이터베이스의 테이블에 연결하고 쿼리할 수 있지만 표준 Postgres에서는 불가능하지만 다른 데이터베이스의 테이블 간에 외부 키 관계를 설정할 수 없습니다.
성능이 중요하고 대부분의 쿼리가 읽기 전용인 경우 데이터를 다른 데이터베이스로 복제하는 것이 좋습니다.불필요한 데이터 복제처럼 보이지만 인덱스가 필요한 경우 도움이 될 수 있습니다.
이 작업은 다른 복사본을 업데이트하기 위해 blink를 호출하는 간단한 삽입 트리거로 수행할 수 있습니다.Slony와 같은 완전한 복제 옵션도 있지만 이는 주제에서 벗어난 것입니다.
https://www.cybertec-postgresql.com/en/joining-data-from-multiple-postgres-databases/ 참조 [2017년 공개]
요즘에는 https://prestodb.io/ 을 사용할 수 있는 옵션도 있습니다.
해당 PrestoDB 노드에서 SQL을 실행할 수 있으며 필요에 따라 SQL 쿼리를 배포합니다.서로 다른 데이터베이스에 대해 동일한 노드에 두 번 연결하거나 서로 다른 호스트의 서로 다른 노드에 연결할 수 있습니다.
다음을 지원하지 않습니다.
DELETE
ALTER TABLE
CREATE TABLE (CREATE TABLE AS is supported)
GRANT
REVOKE
SHOW GRANTS
SHOW ROLES
SHOW ROLE GRANTS
따라서 SELECT 및 JOIN 요구에만 사용해야 합니다.위의 요구사항을 위해 각 데이터베이스에 직접 연결합니다.(좋은 것을 삽입하거나 업데이트할 수도 있을 것 같습니다.)
클라이언트 애플리케이션은 주로 JDBC를 사용하여 PrestoDB에 연결하지만 Tableu 호환 웹 API를 포함한 다른 유형의 연결이 가능합니다.
이것은 Linux Foundation과 Presto Foundation이 관리하는 오픈 소스 도구입니다.
프레스토 재단의 창립 회원은 페이스북, 우버, 트위터, 그리고 알리바바입니다.
현재 회원은 페이스북, 우버, 트위터, 알리바바, 알룩시오, 아하나, 업솔버, 인텔입니다.
데이터베이스 간 쿼리를 수행하는 방법에 대해 좀 더 관련된 예제가 필요한 경우 다음은 데이터베이스를 정리하는 예제입니다.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
$$
언급URL : https://stackoverflow.com/questions/46324/possible-to-perform-cross-database-queries-with-postgresql
'programing' 카테고리의 다른 글
iPhone 시뮬레이터에 .ipa 파일을 설치하는 방법 (0) | 2023.06.03 |
---|---|
XAML Column Definition에서 *(아스터리스크)의 의미는 무엇입니까? (0) | 2023.06.03 |
.NET 5 WPF 프로그램에서 경고 NETSDK1137을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.03 |
Windows 명령줄에서 파일/폴더 이름으로 사용하기에 적합한 형식으로 현재 날짜/시간을 가져오려면 어떻게 해야 합니까? (0) | 2023.06.03 |
호출 방법의 이름을 가져오는 방법은 무엇입니까? (0) | 2023.06.03 |