29.4. 행 토토 커뮤니티#

기본적으로 게시 된 모든 테이블의 모든 데이터는 적절한 가입자에게 복제됩니다. A를 사용하여 복제 된 데이터를 줄일 수 있습니다.행 토토 커뮤니티. 사용자는 행동, 보안 또는 성능 이유에 행 토토 커뮤니티를 사용하도록 선택할 수 있습니다. 게시 된 테이블이 행 토토 커뮤니티를 설정하면 데이터가 행 토토 커뮤니티 표현식을 만족시키는 경우에만 행이 복제됩니다. 이를 통해 테이블 ​​세트를 부분적으로 복제 할 수 있습니다. 행 토토 커뮤니티는 테이블마다 정의됩니다. A 사용여기서데이터를 토토 커뮤니티링 해야하는 각 게시 된 각 테이블의 테이블 이름을 따르는 조항. 그만큼여기서절은 괄호로 둘러싸여 있어야합니다. 보다출판물 만들기자세한 내용.

29.4.1. 행 토토 커뮤니티 규칙#

행 토토 커뮤니티가 적용 됨변경 사항 게시. 행 토토 커뮤니티가 평가하는 경우거짓또는NULL그러면 행이 복제되지 않습니다. 그만큼여기서조항 표현식은 복제 연결에 사용 된 것과 동일한 역할을 통해 평가됩니다 (즉,Connection조항구독 생성). 행 토토 커뮤니티는에 영향을 미치지 않습니다.Truncate명령.

29.4.2. 표현 제한#

the여기서절은 간단한 표현 만 허용합니다. 사용자 정의 기능, 운영자, 유형 및 콜라주, 시스템 열 참조 또는 상상할 수없는 내장 기능을 포함 할 수 없습니다.

출판물이 게시 된 경우업데이트또는삭제작동, 행 토토 커뮤니티여기서조항은 복제 아이덴티티에 의해 다루는 열만 포함해야합니다 (참조복제 아이덴티티). 출판물이 전용으로 게시하는 경우삽입작동, 행 토토 커뮤니티여기서조항은 모든 열을 사용할 수 있습니다.

29.4.3. 업데이트 변환#

언제든지업데이트가 처리되면, 행 토토 커뮤니티 표현식은 구형 및 새 행 모두에 대해 평가됩니다 (즉, 업데이트 전후 데이터 사용). 두 평가가 모두true, 그것은를 복제합니다.업데이트변경. 두 평가가 모두false, 변경 사항을 복제하지 않습니다. 구식/새 행 중 하나만 행 토토 커뮤니티 표현식과 일치하는 경우업데이트삽입또는삭제, 데이터 불일치를 피하기 위해. 가입자의 행은 게시자의 행 토토 커뮤니티 표현식에 의해 정의 된 내용을 반영해야합니다.

이전 행이 행 토토 커뮤니티 표현식을 만족시키는 경우 (가입자에게 전송) 새 행은 데이터 일관성 관점에서 구독자에서 제거되어야합니다. 그래서업데이트|삭제.

이전 행이 행 토토 커뮤니티 표현식을 만족시키지 않으면 (구독자에게 전송되지 않았다) 새 행은 데이터 일관성 관점에서 새 행을 가입자에게 추가해야합니다. 그래서업데이트삽입.

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

표 29.1. 업데이트변환 요약

Old Row New Row 변환
경기 없음 경기 없음 복제하지 마십시오
경기 없음 매치 삽입
매치 경기 없음 삭제
매치 매치 업데이트

29.4.4. 분할 된 테이블#

간행물에 분할 된 테이블이 포함 된 경우 게시 매개 변수publish_via_partition_root사용되는 행 토토 커뮤니티를 결정합니다. 만약에publish_via_partition_rootistrue, The루트 파티션 테이블행 토토 커뮤니티가 사용됩니다. 그렇지 않으면, ifpublish_via_partition_rootis거짓(기본값), 각파티션행 토토 커뮤니티가 사용됩니다.

29.4.5. 초기 데이터 동기화#

구독에 기존 테이블 데이터를 복사하고 출판물에 포함되어있는 경우여기서조항, 행 토토 커뮤니티 표현식을 만족시키는 데이터 만 가입자에게 복사됩니다.

구독에 테이블이 다른 것으로 게시 된 여러 간행물이있는 경우여기서조항, 만족하는 행Any표현식이 복사됩니다. 보다섹션 29.4.6자세한 내용.

경고

초기 데이터 동기화가 고려되지 않기 때문에게시매개 변수 기존 테이블 데이터를 복사 할 때 DML을 사용하여 복제되지 않는 일부 행을 복사 할 수 있습니다. 참조섹션 29.8.1,섹션 29.2.2예제.

Note

가입자가 15 세 이전에 릴리스에 있으면 기존 데이터 복사는 출판물에 정의 된 경우에도 행 토토 커뮤니티를 사용하지 않습니다. 이전 릴리스는 전체 테이블 데이터 만 복사 할 수 있기 때문입니다.

29.4.6. 여러 행 토토 커뮤니티 결합#

구독에 동일한 테이블이 다른 행 토토 커뮤니티로 게시 된 여러 개의 간행물이있는 경우 (동일하게게시Operation), 그 표현이 함께 오게되므로 행이 만족스러워Any표현식이 복제됩니다. 이것은 동일한 테이블의 다른 행 토토 커뮤니티가 다음과 같은 경우 중복됩니다.

  • 간행물 중 하나에는 행 토토 커뮤니티가 없습니다.

  • 출판물 중 하나가를 사용하여 작성되었습니다.모든 테이블의 경우. 이 조항은 행 토토 커뮤니티를 허용하지 않습니다.

  • 출판물 중 하나가를 사용하여 만들어졌습니다.스키마 테이블그리고 테이블은 참조 스키마에 속합니다. 이 조항은 행 토토 커뮤니티를 허용하지 않습니다.

29.4.7. 예#

다음 예제에서 사용할 테이블을 만듭니다.

test_pub =# 테이블 생성 t1 (a int, b int, c 텍스트, 기본 키 (a, c));
테이블을 만듭니다
test_pub =# 생성 테이블 t2 (d int, e int, f int, 기본 키 (d));
테이블을 만듭니다
test_pub =# 생성 테이블 t3 (g int, h int, i int, 1 차 키 (g));
테이블 작성

일부 출판물을 만듭니다. 출판P1하나의 테이블이 있습니다 (T1) 해당 테이블에는 행 토토 커뮤니티가 있습니다. 출판P2두 개의 테이블이 있습니다. 테이블T1행 토토 커뮤니티가없고 테이블이 없습니다T2행 토토 커뮤니티가 있습니다. 출판P3두 개의 테이블이 있으며 둘 다 행 토토 커뮤니티가 있습니다.

test_pub =# 표 T1에 대한 출판 p1을 만듭니다 (a 5 및 c = 'nsw');
출판물을 만듭니다
test_pub =# 표 T1, t2에 대한 출판물 생성 P2 (e = 99);
출판물을 만듭니다
test_pub =# 표 T2에 대한 출판물 p3를 만듭니다 (d = 10), t3 여기서 (g = 10);
출판물 만들기

PSQL각 간행물에 대한 행 토토 커뮤니티 표현식 (정의 된 경우)을 표시하는 데 사용할 수 있습니다.

test_pub =# \ drp+
                               간행물 P1
  소유자 | 모든 테이블 | 삽입 | 업데이트 | 삭제 | 잘린 | 루트를 통해
-------------------+---------+--------+----------------------------------------------------------------------
 Postgres | f | t | t | t | t | 에프
테이블 :
    "public.t1"여기서 ((A 5) 및 (C = 'NSW':: 텍스트))

                               간행물 P2
  소유자 | 모든 테이블 | 삽입 | 업데이트 | 삭제 | 잘린 | 루트를 통해
-------------------+---------+--------+----------------------------------------------------------------------
 Postgres | f | t | t | t | t | 에프
테이블 :
    "public.t1"
    "public.t2"여기서 (E = 99)

                               간행물 P3
  소유자 | 모든 테이블 | 삽입 | 업데이트 | 삭제 | 잘린 | 루트를 통해
-------------------+---------+--------+----------------------------------------------------------------------
 Postgres | f | t | t | t | t | 에프
테이블 :
    "public.t2"여기서 (d = 10)
    "public.t3"여기서 (g = 10)

PSQL각 테이블의 행 토토 커뮤니티 표현식 (정의 된 경우)을 표시하는 데 사용할 수 있습니다. 그 표를 ​​참조하십시오T1두 개의 간행물의 회원이지만에만 행 토토 커뮤니티가 있습니다.P1. 그 표를 ​​참조하십시오T2두 개의 간행물의 회원이며 각각에 다른 행 토토 커뮤니티가 있습니다.

test_pub =# \ d t1
                 "public.t1"테이블
 열 |  유형 | Collation | 무효 | 기본
--------+--------+-------------------------------
 A | 정수 |           | NOL NULL |
 B | 정수 |           |          |
 C | 텍스트 |           | NOL NULL |
인덱스 :
    "T1_PKEY"1 차 키, BTREE (A, C)
간행물 :
    "P1"여기서 ((A 5) 및 (C = 'NSW':: Text)))
    "P2"

test_pub =# \ d t2
                 "public.t2"테이블
 열 |  유형 | Collation | 무효 | 기본
--------+--------+-------------------------------
 d | 정수 |           | NOL NULL |
 e | 정수 |           |          |
 f | 정수 |           |          |
인덱스 :
    "T2_PKEY"1 차 키, BTREE (D)
간행물 :
    "P2"여기서 (E = 99)
    "P3"여기서 (D = 10)

test_pub =# \ d t3
                 "public.t3"테이블
 열 |  유형 | Collation | 무효 | 기본
--------+--------+-------------------------------
 g | 정수 |           | NOL NULL |
 H | 정수 |           |          |
 i | 정수 |           |          |
인덱스 :
    "T3_PKEY"1 차 키, BTREE (G)
간행물 :
    "P3"여기서 (g = 10)

가입자 노드에서 테이블 작성T1게시자의 것과 동일한 정의를 가진 구독S1출판물 구독P1.

test_sub =# 테이블 생성 t1 (a int, b int, c 텍스트, 기본 키 (a, c));
테이블을 만듭니다
test_sub =# 구독 생성 S1
test_sub-# connection 'host = localhost dbname = test_pub application_name = s1'
test_sub-# publication 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;
 A |  B |  기음
---+-----+-----
 2 | 102 | NSW
 3 | 103 | QLD
 4 | 104 | 빅
 5 | 105 | 행동
 6 | 106 | NSW
 7 | 107 | NT
 8 | 108 | QLD
 9 | 109 | NSW
(8 줄)
test_sub =# select * from t1;
 A |  B |  기음
---+-----+-----
 6 | 106 | NSW
 9 | 109 | NSW
(2 줄)

구식 및 새 행 값이 모두 만족하는 일부 데이터를 업데이트합니다T1 여기서출판 조항P1. 그만큼업데이트변경 사항을 정상적으로 복제합니다.

test_pub =# 업데이트 t1 set b = 999 여기서 a = 6;
업데이트 1

test_pub =# select * from t1;
 A |  B |  기음
---+-----+-----
 2 | 102 | NSW
 3 | 103 | QLD
 4 | 104 | 빅
 5 | 105 | 행동
 7 | 107 | NT
 8 | 108 | QLD
 9 | 109 | NSW
 6 | 999 | NSW
(8 줄)
test_sub =# select * from t1;
 A |  B |  기음
---+-----+-----
 9 | 109 | NSW
 6 | 999 | NSW
(2 줄)

이전 행 값이 만족하지 않은 일부 데이터를 업데이트합니다T1 여기서출판 조항P1, 그러나 새로운 행 값은이를 만족시킵니다. 그만큼업데이트삽입그리고 변경이 복제됩니다. 가입자의 새 행을 참조하십시오.

test_pub =# 업데이트 t1 설정 a = 555 여기서 a = 2;
업데이트 1

test_pub =# select * from t1;
  A |  B |  기음
-----+-----+-----
   3 | 103 | QLD
   4 | 104 | 빅
   5 | 105 | 행동
   7 | 107 | NT
   8 | 108 | QLD
   9 | 109 | NSW
   6 | 999 | NSW
 555 | 102 | NSW
(8 줄)
test_sub =# select * from t1;
  A |  B |  기음
-----+-----+-----
   9 | 109 | NSW
   6 | 999 | NSW
 555 | 102 | NSW
(3 줄)

이전 행 값이 만족 한 일부 데이터 업데이트t1 여기서출판 조항P1그러나 새 행 값은이를 충족시키지 못합니다. 그만큼업데이트|삭제그리고 변경이 복제됩니다. 가입자에서 행이 제거 된 것을 확인하십시오.

test_pub =# 업데이트 t1 set c = 'vic'여기서 a = 9;
업데이트 1

test_pub =# select * from t1;
  A |  B |  기음
-----+-----+-----
   3 | 103 | QLD
   4 | 104 | 빅
   5 | 105 | 행동
   7 | 107 | NT
   8 | 108 | QLD
   6 | 999 | NSW
 555 | 102 | NSW
   9 | 109 | 빅
(8 줄)
test_sub =# select * from t1;
  A |  B |  기음
-----+-----+-----
   6 | 999 | NSW
 555 | 102 | NSW
(2 줄)

다음 예제는 게시 매개 변수를 보여줍니다.publish_via_partition_root분할 된 테이블의 경우 부모 또는 자식 테이블의 행 토토 커뮤니티가 사용되는지 여부를 결정합니다.

게시자에 파티션 된 테이블을 만듭니다.

test_pub =# 범위별로 테이블 부모 (int 기본 키) 파티션 (a);
테이블을 만듭니다
test_pub =# Parent Default의 테이블 자식 자식 생성;
테이블 작성

가입자에 동일한 테이블을 만듭니다.

test_sub =# 테이블 작성 부모 (int 기본 키) 범위별로 파티션 (a);
테이블을 만듭니다
test_sub =# Parent Default의 테이블 자식 자식 생성;
테이블 작성

출판물 만들기P4를 구독하십시오. 게시 매개 변수publish_via_partition_root는 참으로 설정되었습니다. 분할 된 테이블 모두에 정의 된 행 토토 커뮤니티가 있습니다 (부모) 및 파티션 (Child).

test_pub =# 테이블 부모에 대한 출판물 P4 (a <5), Child Where (a = 5)
test_pub-# with (publish_via_partition_root = true);
출판물 만들기
test_sub =# 구독 S4 생성
test_sub-# connection 'host = localhost dbname = test_pub application_name = s4'
test_sub-# publication p4;
구독 생성

직접 값을 직접 삽입부모andChild테이블. 그들은의 행 토토 커뮤니티를 사용하여 복제합니다.부모(왜냐하면publish_via_partition_root사실).

test_pub =# 부모 값 (2), (4), (6)에 삽입;
삽입 0 3
test_pub =# 자식 값에 삽입 (3), (5), (7);
삽입 0 3

test_pub =# select *에서 a;
 에이
---
 2
 3
 4
 5
 6
 7
(6 줄)
test_sub =# select *에서 a로 부모 주문에서;
 에이
---
 2
 3
 4
(3 줄)

동일한 테스트를 반복하지만 다른 값이 다른publish_via_partition_root. 게시 매개 변수publish_via_partition_root는 False로 설정됩니다. 행 토토 커뮤니티는 파티션에 정의됩니다 (Child).

test_pub =# 드롭 출판 P4;
드롭 출판
test_pub =# 테이블 부모, 자녀에 대한 출판물 생성 P4 (a = 5)
test_pub-# with (publish_via_partition_root = false);
출판물 만들기
test_sub =# 구독 S4 새로 고침 출판;
구독 변경

이전과 동일하게 게시자의 삽입물을 수행하십시오. 그들은의 행 토토 커뮤니티를 사용하여 복제합니다.Child(왜냐하면publish_via_partition_root거짓).

test_pub =# truncate parent;
절단 테이블
test_pub =# 부모 값 (2), (4), (6)에 삽입;
삽입 0 3
test_pub =# 자식 값에 삽입 (3), (5), (7);
삽입 0 3

test_pub =# select *에서 a;
 에이
---
 2
 3
 4
 5
 6
 7
(6 줄)
test_sub =# 선택 * 자식 주문에서 a;
 에이
---
 5
 6
 7
(3 줄)

정정 제출

올바르지 않은 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면