31.3. 행 무지개 토토

기본적으로 모든 게시된 테이블의 모든 데이터는 해당 구독자에게 복제됩니다. 복제된 데이터는 다음을 사용하여 줄일 수 있습니다.행 무지개 토토. 사용자는 행동, 보안 또는 성능상의 이유로 행 무지개 토토를 사용하도록 선택할 수 있습니다. 게시된 테이블에 행 무지개 토토가 설정되면 해당 데이터가 행 무지개 토토 식을 충족하는 경우에만 행이 복제됩니다. 이를 통해 테이블 세트를 부분적으로 복제할 수 있습니다. 행 무지개 토토는 테이블별로 정의됩니다. 를 사용하세요어디에서8315_8414어디절은 괄호로 묶어야 합니다. 참조출판물 작성자세한 내용은.

31.3.1. 행 무지개 토토 규칙

행 무지개 토토가 적용되었습니다이전에변경사항 게시 중. 행 무지개 토토가 다음과 같이 평가되는 경우거짓또는NULL그러면 행이 복제되지 않습니다.어디에서절 표현식은 복제 연결에 사용된 것과 동일한 역할(즉,연결의 절구독 작성). 행 무지개 토토는 다음 항목에 적용되지 않습니다.잘라내기명령.

31.3.2. 표현 제한

어디절은 간단한 표현식만 허용합니다. 사용자 정의 함수, 연산자, 유형 및 데이터 정렬, 시스템 열 참조 또는 불변 내장 함수를 포함할 수 없습니다.

간행물이 출판되는 경우업데이트또는삭제작업, 행 무지개 토토어디절에는 복제본 ID가 적용되는 열만 포함되어야 합니다(참조복제본 ID). 출판물이 출판만 된 경우삽입작업, 행 무지개 토토어디절은 모든 열을 사용할 수 있습니다.

31.3.3. 업데이트 변환

언제든지업데이트이 처리되면 행 무지개 토토 표현식은 이전 행과 새 행 모두에 대해 평가됩니다(즉, 업데이트 전후의 데이터 사용). 두 평가가 모두 다음과 같은 경우, 이는 다음을 복제합니다.업데이트변경. 두 평가가 모두 다음과 같은 경우거짓, 변경 사항을 복제하지 않습니다. 이전/새 행 중 하나만 행 무지개 토토 표현식과 일치하는 경우,업데이트다음으로 변환됨삽입또는삭제, 데이터 불일치를 방지합니다. 구독자의 행은 게시자의 행 무지개 토토 표현식으로 정의된 내용을 반영해야 합니다.

이전 행이 행 무지개 토토 표현식을 만족하지만(구독자에게 전송됨) 새 행이 만족하지 않으면 데이터 일관성 관점에서 이전 행을 구독자에서 제거해야 합니다. 그래서업데이트다음으로 변환됩니다.삭제.

이전 행이 행 무지개 토토 표현식을 충족하지 않지만(구독자에게 전송되지 않음) 새 행이 충족하는 경우 데이터 일관성 관점에서 새 행이 구독자에 추가되어야 합니다. 그래서업데이트는로 변환됩니다.삽입.

표 31.1적용된 변환을 요약합니다.

표 31.1. 업데이트변환 요약

이전 행 새 행 변환
일치하지 않음 일치하지 않음 복제하지 않음
일치하지 않음 일치 삽입
일치 일치하지 않음 삭제
일치 일치 업데이트

31.3.4. 분할된 테이블

게시물에 분할된 테이블이 포함된 경우 게시 매개변수publish_via_partition_root사용되는 행 무지개 토토를 결정합니다. 만일publish_via_partition_root이다, 그루트로 파티션을 나눈 테이블행 무지개 토토가 사용되었습니다. 그렇지 않은 경우, 만약publish_via_partition_rootis거짓(기본값), 각각파티션의행 무지개 토토가 사용되었습니다.

31.3.5. 초기 데이터 동기화

구독에 기존 테이블 데이터 복사가 필요하고 게시에 다음이 포함된 경우어디절, 행 무지개 토토 표현식을 만족하는 데이터만 구독자에게 복사됩니다.

구독에 테이블이 서로 다른 출판물이 여러 개 있는 경우어디절, 만족하는 행모든표현식이 복사됩니다. 참조섹션 31.3.6자세한 내용은.

경고

초기 데이터 동기화는 다음을 고려하지 않기 때문입니다.게시매개변수를 사용하면 DML을 사용하여 복제되지 않는 일부 행이 복사될 수 있습니다. 참조섹션 31.7.1그리고 보세요섹션 31.2.2예를 들어.

참고

구독자가 15 이전 릴리스에 있는 경우 기존 데이터 복사는 발행물에 정의되어 있더라도 행 무지개 토토를 사용하지 않습니다. 이전 릴리스에서는 전체 테이블 데이터만 복사할 수 있기 때문입니다.

31.3.6. 여러 행 무지개 토토 결합

구독에 동일한 테이블이 다른 행 무지개 토토로 게시된 여러 게시가 있는 경우(동일한 경우게시연산), 해당 표현식은 OR로 연결되어 행이 만족됩니다.아무거나표현식이 복제됩니다. 이는 다음과 같은 경우 동일한 테이블의 다른 모든 행 무지개 토토가 중복된다는 의미입니다.

  • 게시물 중 하나에 행 무지개 토토가 없습니다.

  • 간행물 중 하나는 다음을 사용하여 생성되었습니다.모든 테이블에 대해. 이 절은 행 무지개 토토를 허용하지 않습니다.

  • 간행물 중 하나는 다음을 사용하여 생성되었습니다.스키마 테이블의 경우그리고 테이블은 참조된 스키마에 속합니다. 이 절은 행 무지개 토토를 허용하지 않습니다.

31.3.7. 예

다음 예에서 사용할 테이블을 만드십시오.

test_pub=# CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c));
테이블 만들기
test_pub=# CREATE TABLE t2(d int, e int, f int, PRIMARY KEY(d));
테이블 만들기
test_pub=# CREATE TABLE t3(g int, h int, i int, PRIMARY KEY(g));
테이블 만들기

간행물을 만드세요. 출판p1테이블이 하나 있습니다(t1) 해당 테이블에는 행 무지개 토토가 있습니다. 출판p2테이블이 두 개 있습니다. 표t1행 무지개 토토가 없고 테이블이 있음t2행 무지개 토토가 있습니다. 출판p3두 개의 테이블이 있고 둘 다 행 무지개 토토가 있습니다.

test_pub=# CREATE Publication p1 FOR TABLE t1 WHERE (a  5 AND c = 'NSW');
출판물 만들기
test_pub=# 테이블 t1, t2에 대한 출판 p2 생성 WHERE(e = 99);
출판물 만들기
test_pub=# 테이블 t2 WHERE(d = 10), t3 WHERE(g = 10)에 대한 출판 p3 생성;
출판물 생성

psql각 게시에 대한 행 무지개 토토 표현식(정의된 경우)을 표시하는 데 사용할 수 있습니다.

test_pub=# \dRp+
                               출판물 p1
  소유자 | 모든 테이블 | 삽입물 | 업데이트 | 삭제 | 잘림 | 루트를 통해
----------+------------+---------+---------+---------+---------+---------+------------
 포스트그레스 | 에프 | 티 | 티 | 티 | 티 | 에프
테이블:
    "public.t1" WHERE ((a  5) AND (c = 'NSW'::text))

                               출판물 p2
  소유자 | 모든 테이블 | 삽입물 | 업데이트 | 삭제 | 잘림 | 루트를 통해
----------+------------+---------+---------+---------+---------+---------+------------
 포스트그레스 | 에프 | 티 | 티 | 티 | 티 | 에프
테이블:
    "공개.t1"
    "public.t2" 어디(e = 99)

                               출판물 p3
  소유자 | 모든 테이블 | 삽입물 | 업데이트 | 삭제 | 잘림 | 루트를 통해
----------+------------+---------+---------+---------+---------+---------+------------
 포스트그레스 | 에프 | 티 | 티 | 티 | 티 | 에프
테이블:
    "public.t2" 어디(d = 10)
    "public.t3" 어디(g = 10)

psql는 각 테이블에 대한 행 무지개 토토 표현식(정의된 경우)을 표시하는 데 사용할 수 있습니다. 해당 표를 참조하세요.t1두 게시의 구성원이지만 행 무지개 토토는 다음에만 있습니다.p1. 해당 표를 참조하세요.t2은 두 출판물의 구성원이며 각각 다른 행 무지개 토토를 가지고 있습니다.

test_pub=# \d t1
                 테이블 "public.t1"
 칼럼 |  유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
 | 정수 |           | null이 아님 |
 비 | 정수 |           |          |
 c | 텍스트 |           | null이 아님 |
인덱스:
    "t1_pkey" 기본 키, btree(a, c)
출판물:
    "p1" WHERE ((a  5) AND (c = 'NSW'::text))
    "p2"

test_pub=# \d t2
                 테이블 "public.t2"
 칼럼 |  유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
 디 | 정수 |           | null이 아님 |
 전자 | 정수 |           |          |
 에프 | 정수 |           |          |
인덱스:
    "t2_pkey" 기본 키, btree(d)
출판물:
    "p2" 어디서(e = 99)
    "p3" 어디서(d = 10)

test_pub=# \d t3
                 테이블 "public.t3"
 칼럼 |  유형 | 데이터 정렬 | 널 입력 가능 | 기본값
---------+---------+------------+----------+---------
 지 | 정수 |           | null이 아님 |
 시간 | 정수 |           |          |
 나 | 정수 |           |          |
인덱스:
    "t3_pkey" 기본 키, btree(g)
출판물:
    "p3" 어디(g = 10)

구독자 노드에서 테이블을 생성하십시오.t1게시자의 정의와 동일한 정의를 사용하고 구독도 생성s1간행물을 구독하는 사람p1.

test_sub=# CREATE TABLE t1(a int, b int, c text, PRIMARY KEY(a,c));
테이블 만들기
test_sub=# 구독 만들기 s1
test_sub-# 연결 '호스트=localhost dbname=test_pub 애플리케이션 이름=s1'
test_sub-# 출판물 p1;
구독 만들기

일부 행을 삽입하세요. 를 만족하는 행만t1 어디게시 조항p1복제되었습니다.

test_pub=# t1 값에 삽입(2, 102, 'NSW');
삽입 0 1
test_pub=# t1 값에 삽입(3, 103, 'QLD');
삽입 0 1
test_pub=# t1 값에 삽입(4, 104, 'VIC');
삽입 0 1
test_pub=# t1 값에 삽입(5, 105, 'ACT');
삽입 0 1
test_pub=# t1 값에 삽입(6, 106, 'NSW');
삽입 0 1
test_pub=# t1 값에 삽입(7, 107, 'NT');
삽입 0 1
test_pub=# t1 값에 삽입(8, 108, 'QLD');
삽입 0 1
test_pub=# t1 값에 삽입(9, 109, 'NSW');
삽입 0 1

test_pub=# SELECT * FROM t1;
 |  비 |  ㄷ
---+------+-----
 2 | 102 | NSW
 3 | 103 | 퀸즐랜드
 4 | 104 | 빅
 5 | 105 | 행위
 6 | 106 | NSW
 7 | 107 | NT
 8 | 108 | 퀸즐랜드
 9 | 109 | NSW
(8행)
test_sub=# SELECT * FROM t1;
 |  비 |  ㄷ
---+------+-----
 6 | 106 | NSW
 9 | 109 | NSW
(2행)

이전 행 값과 새 행 값이 모두 다음을 만족하는 일부 데이터를 업데이트하세요.t1 어디게시 조항p1.업데이트변경사항을 정상적으로 복제합니다.

test_pub=# 업데이트 t1 SET b = 999 WHERE a = 6;
업데이트 1

test_pub=# SELECT * FROM t1;
 |  비 |  ㄷ
---+------+-----
 2 | 102 | NSW
 3 | 103 | 퀸즐랜드
 4 | 104 | 빅
 5 | 105 | 행위
 7 | 107 | NT
 8 | 108 | 퀸즐랜드
 9 | 109 | NSW
 6 | 999 | NSW
(8행)
test_sub=# SELECT * FROM t1;
 |  비 |  ㄷ
---+------+-----
 9 | 109 | NSW
 6 | 999 | NSW
(2행)

이전 행 값이 다음을 충족하지 않는 일부 데이터를 업데이트합니다.t1 어디게시 조항p1, 그러나 새 행 값은 이를 충족합니다.업데이트는로 변환됩니다.삽입그리고 변경사항이 복제됩니다. 구독자의 새 행을 확인하세요.

test_pub=# 업데이트 t1 SET a = 555 WHERE a = 2;
업데이트 1

test_pub=# SELECT * FROM t1;
  |  비 |  ㄷ
----+------+-----
   3 | 103 | 퀸즐랜드
   4 | 104 | 빅
   5 | 105 | 행위
   7 | 107 | NT
   8 | 108 | 퀸즐랜드
   9 | 109 | NSW
   6 | 999 | NSW
 555 | 102 | NSW
(8행)
test_sub=# SELECT * FROM t1;
  |  비 |  ㄷ
----+------+-----
   9 | 109 | NSW
   6 | 999 | NSW
 555 | 102 | NSW
(3행)

이전 행 값이 만족하는 일부 데이터 업데이트t1 어디게시 조항p1이지만 새 행 값이 이를 충족하지 않습니다.업데이트a로 변환됩니다.삭제그리고 변경사항이 복제됩니다. 구독자에서 행이 제거되었는지 확인하세요.

test_pub=# 업데이트 t1 SET c = 'VIC' WHERE a = 9;
업데이트 1

test_pub=# SELECT * FROM t1;
  |  비 |  ㄷ
----+------+-----
   3 | 103 | 퀸즐랜드
   4 | 104 | 빅
   5 | 105 | 행위
   7 | 107 | NT
   8 | 108 | 퀸즐랜드
   6 | 999 | NSW
 555 | 102 | NSW
   9 | 109 | 빅
(8행)
test_sub=# SELECT * FROM t1;
  |  비 |  ㄷ
----+------+-----
   6 | 999 | NSW
 555 | 102 | NSW
(2행)

다음 예는 게시 매개변수가 어떻게 작동하는지 보여줍니다.publish_via_partition_root분할된 테이블의 경우 상위 또는 하위 테이블의 행 무지개 토토를 사용할지 여부를 결정합니다.

게시자에 파티션된 테이블을 생성하십시오.

test_pub=# CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a);
테이블 만들기
test_pub=# 상위 DEFAULT의 테이블 하위 파티션 생성;
테이블 만들기

구독자에 동일한 테이블을 생성하십시오.

test_sub=# CREATE TABLE parent(a int PRIMARY KEY) PARTITION BY RANGE(a);
테이블 만들기
test_sub=# 상위 DEFAULT의 테이블 하위 파티션 생성;
테이블 만들기

간행물 작성p4을 선택한 다음 구독하세요. 출판 매개변수publish_via_partition_root이 true로 설정되었습니다. 파티션을 나눈 테이블() 모두에 행 무지개 토토가 정의되어 있습니다.부모) 및 파티션(아이).

test_pub=# CREATE PUBLICATION p4 FOR TABLE 상위 WHERE(a < 5), 하위 WHERE(a = 5)
test_pub-# WITH (publish_via_partition_root=true);
출판물 생성
test_sub=# 구독 만들기 s4
test_sub-# 연결 'host=localhost dbname=test_pub application_name=s4'
test_sub-# 출판 p4;
구독 만들기

일부 값을 다음에 직접 삽입부모그리고아이테이블. 그들은 다음의 행 무지개 토토를 사용하여 복제합니다.부모(왜냐하면publish_via_partition_root사실입니다).

test_pub=# 상위 값에 삽입 (2), (4), (6);
삽입 0 3
test_pub=# 하위 값에 삽입 (3), (5), (7);
삽입 0 3

test_pub=# SELECT * FROM 상위 ORDER BY a;
 에
---
 2
 3
 4
 5
 6
 7
(6행)
test_sub=# SELECT * FROM 상위 ORDER BY a;
 에
---
 2
 3
 4
(3행)

동일한 테스트를 반복하지만 다른 값을 사용하여publish_via_partition_root. 출판 매개변수publish_via_partition_root거짓으로 설정되었습니다. 행 무지개 토토는 파티션()에 정의되어 있습니다.아이).

test_pub=# 출판물 4페이지 삭제;
출판 중단
test_pub=# 테이블 부모, 자식 WHERE(a = 5)에 대한 출판물 생성 p4
test_pub-# WITH (publish_via_partition_root=false);
출판물 생성
test_sub=# 구독 변경 s4 게시 새로 고침;
구독 변경

이전과 동일하게 게시자에 삽입을 수행하십시오. 그들은 다음의 행 무지개 토토를 사용하여 복제합니다.아이(왜냐하면publish_via_partition_root거짓입니다).

test_pub=# TRUNCATE 상위;
테이블 자르기
test_pub=# 상위 값에 삽입 (2), (4), (6);
삽입 0 3
test_pub=# 하위 값에 삽입 (3), (5), (7);
삽입 0 3

test_pub=# SELECT * FROM 상위 ORDER BY a;
 에
---
 2
 3
 4
 5
 6
 7
(6행)
test_sub=# SELECT * FROM child ORDER BY a;
 에
---
 5
 6
 7
(3행)

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.