CREATE PUBLICATION
CREATE PUBLICATION
새 게시(publish)를 현재 데이터베이스에 추가하는 명령이에요. 논리 복제(logical replication)에서 어떤 테이블의 변경 사항을 구독자에게 보낼지를 정의하는 객체입니다.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
CREATE PUBLICATION name
[ FOR ALL TABLES
| FOR publication_object [, ... ] ]
[ WITH ( publication_parameter [= value] [, ... ] ) ]
where publication_object is one of:
TABLE table_and_columns [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and table_and_columns is:
[ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]
설명 (Description)
CREATE PUBLICATION은 새 게시를 현재 데이터베이스에 추가해요. 게시 이름은 현재 데이터베이스의 기존 게시 이름과 달라야 합니다.
게시는 본질적으로 데이터 변경이 논리 복제를 통해 복제되도록 의도된 테이블들의 그룹이에요. 게시가 논리 복제 설정에 어떻게 들어맞는지에 대한 자세한 내용은 29.1절을 참고하세요.
파라미터 (Parameters)
name— 새 게시의 이름.FOR TABLE— 게시에 추가할 테이블 목록을 지정해요. 테이블 이름 앞에ONLY를 지정하면 그 테이블만 게시에 추가되고,ONLY를 지정하지 않으면 그 테이블과 모든 하위 테이블(있으면)이 추가됩니다. 선택적으로 테이블 이름 뒤에*를 지정해 하위 테이블이 포함됨을 명시적으로 나타낼 수 있어요. 다만 이는 파티션 테이블에는 적용되지 않습니다. 파티션 테이블의 파티션은 항상 암묵적으로 게시의 일부로 간주되므로 명시적으로 게시에 추가되지 않아요. 선택적WHERE절을 지정하면 행 필터(row filter) 표현식을 정의합니다.expression이 false 또는 null로 평가되는 행은 게시되지 않습니다. 표현식 주위에 괄호가 필요하다는 점에 주의하세요.TRUNCATE명령에는 영향을 미치지 않습니다. 컬럼 목록을 지정하면 명명된 컬럼만 복제됩니다. 컬럼 목록에는 저장 생성 컬럼(stored generated column)도 포함될 수 있어요. 컬럼 목록을 생략하면 게시는 기본적으로 (미래에 추가되는 것을 포함해) 모든 비-생성 컬럼을 복제합니다.publish_generated_columns를stored로 설정하면 저장 생성 컬럼도 복제될 수 있습니다. 컬럼 목록을 지정해도TRUNCATE명령에는 영향을 미치지 않아요. 컬럼 목록에 대한 자세한 내용은 29.5절을 참고하세요. 영구 기본 테이블과 파티션 테이블만 게시의 일부가 될 수 있어요. 임시 테이블, 언로깅 테이블, 외부 테이블, 구체화 뷰, 일반 뷰는 게시의 일부가 될 수 없습니다. 게시가FOR TABLES IN SCHEMA도 게시할 때 컬럼 목록을 지정하는 것은 지원되지 않아요. 파티션 테이블이 게시에 추가되면 기존 및 미래의 모든 파티션이 암묵적으로 게시의 일부로 간주됩니다. 따라서 파티션에 직접 수행된 연산도 그 조상이 속한 게시를 통해 게시됩니다.FOR ALL TABLES— 데이터베이스의 모든 테이블(미래에 만들어지는 테이블 포함)의 변경을 복제하는 게시로 표시해요.FOR TABLES IN SCHEMA— 지정한 스키마 목록의 모든 테이블(미래에 만들어지는 테이블 포함)의 변경을 복제하는 게시로 표시합니다. 게시가 컬럼 목록이 있는 테이블도 게시할 때 스키마를 지정하는 것은 지원되지 않아요. 스키마에 있는 영구 기본 테이블과 파티션 테이블만 게시의 일부로 포함됩니다. 그 스키마의 임시 테이블, 언로깅 테이블, 외부 테이블, 구체화 뷰, 일반 뷰는 게시의 일부가 되지 않아요. 파티션 테이블이 스키마 수준 게시를 통해 게시되면, 기존 및 미래의 모든 파티션이 게시 스키마에서 온 것이든 아니든 암묵적으로 게시의 일부로 간주됩니다. 따라서 파티션에 직접 수행된 연산도 그 조상이 속한 게시를 통해 게시됩니다.WITH ( publication_parameter [= value] [, ... ] )— 게시의 선택적 파라미터를 지정하는 절. 지원되는 파라미터는 다음과 같습니다:publish(string) — 이 파라미터는 새 게시가 구독자에게 어떤 DML 연산을 게시할지 결정해요. 값은 연산들의 쉼표 구분 목록입니다. 허용되는 연산은insert,update,delete,truncate이며 기본은 모든 동작을 게시하는 것이라 이 옵션의 기본값은'insert, update, delete, truncate'입니다. 이 파라미터는 DML 연산에만 영향을 미칩니다. 특히 논리 복제의 초기 데이터 동기화(29.9.1절 참고)는 기존 테이블 데이터를 복사할 때 이 파라미터를 고려하지 않아요.publish_generated_columns(enum) — 게시와 연관된 테이블에 있는 생성 컬럼을 복제할지 여부를 지정해요. 가능한 값은none과stored이며 기본은none으로, 게시와 연관된 테이블의 생성 컬럼은 복제되지 않습니다.stored로 설정하면 게시와 연관된 테이블의 저장 생성 컬럼이 복제됩니다. 구독자가 18 이전 릴리스라면 초기 테이블 동기화는 발행자가publish_generated_columns가stored여도 생성 컬럼을 복사하지 않습니다. 생성 컬럼의 논리 복제에 대한 자세한 내용은 29.6절을 참고하세요.publish_via_partition_root(boolean) — 이 파라미터는 파티션 테이블(또는 그 파티션)의 변경이 어떻게 게시되는지를 제어해요.true로 설정하면 변경이 루트 파티션 테이블의 정체성(identity)과 스키마로 게시됩니다.false(기본)로 설정하면 변경이 실제로 발생한 개별 파티션의 정체성과 스키마로 게시돼요. 이 옵션을 켜면 변경이 비-파티션 테이블이나 발행자와 파티션 구조가 다른 파티션 테이블로 복제될 수 있습니다. 구독이 여러 게시를 결합하는 경우가 있을 수 있는데, 게시된 파티션 테이블이publish_via_partition_root = true로 설정된 구독 게시 중 하나라도 있으면 그 파티션 테이블(또는 그 파티션)의 변경은 개별 파티션의 정체성이 아니라 그 파티션 테이블의 정체성과 스키마로 게시됩니다. 이 파라미터는 파티션에 대한 행 필터와 컬럼 목록이 어떻게 선택되는지에도 영향을 줍니다(아래 참고). 이를 켜면 파티션에 직접 수행된TRUNCATE연산은 복제되지 않습니다.
boolean 타입 파라미터를 지정할 때 = value 부분을 생략할 수 있는데, 이는 TRUE를 지정한 것과 동등합니다.
주의 사항 (Notes)
FOR TABLE, FOR ALL TABLES, FOR TABLES IN SCHEMA 중 어느 것도 지정하지 않으면 게시는 빈 테이블 집합으로 시작해요. 나중에 테이블이나 스키마를 추가하려 할 때 유용합니다.
게시를 만든다고 해서 복제가 시작되지는 않아요. 미래 구독자들을 위한 그룹화·필터링 로직만 정의할 뿐입니다.
게시를 만들려면 실행하는 사용자에게 현재 데이터베이스에 대한 CREATE 권한이 있어야 해요. (물론 슈퍼유저는 이 검사를 우회합니다.)
게시에 테이블을 추가하려면 실행하는 사용자에게 그 테이블에 대한 소유권이 있어야 합니다. FOR ALL TABLES와 FOR TABLES IN SCHEMA 절은 실행하는 사용자가 슈퍼유저여야 해요.
UPDATE 및/또는 DELETE 연산을 게시하는 게시에 추가된 테이블은 REPLICA IDENTITY가 정의돼 있어야 합니다. 그렇지 않으면 그 테이블에서 그 연산들이 허용되지 않아요.
UPDATE 또는 DELETE 연산이 게시되려면 어떤 컬럼 목록이든 REPLICA IDENTITY 컬럼을 포함해야 합니다. 게시가 INSERT 연산만 게시하면 컬럼 목록 제한은 없습니다.
UPDATE와 DELETE 연산이 게시되려면 행 필터 표현식(즉 WHERE 절)이 REPLICA IDENTITY가 다루는 컬럼만 포함해야 해요. INSERT 연산 게시에는 WHERE 표현식에 어떤 컬럼이든 쓸 수 있습니다. 행 필터는 사용자 정의 함수, 사용자 정의 연산자, 사용자 정의 타입, 사용자 정의 콜레이션, 비-불변(non-immutable) 내장 함수, 시스템 컬럼 참조가 없는 단순 표현식만 허용합니다.
REPLICA IDENTITY의 일부인 생성 컬럼은, UPDATE와 DELETE 연산이 게시되려면 컬럼 목록에 나열하거나 publish_generated_columns 옵션을 켜서 명시적으로 게시돼야 해요.
FOR TABLES IN SCHEMA가 지정되고 테이블이 해당 스키마에 속하면 그 테이블의 행 필터는 중복이 됩니다.
게시된 파티션 테이블에서 각 파티션의 행 필터는, 게시 파라미터 publish_via_partition_root가 true이면 게시된 파티션 테이블에서, false(기본)이면 파티션 자체에서 가져옵니다. 행 필터에 대한 자세한 내용은 29.4절을 참고하세요. 마찬가지로 게시된 파티션 테이블에서 각 파티션의 컬럼 목록도, publish_via_partition_root가 true이면 게시된 파티션 테이블에서, false이면 파티션 자체에서 가져옵니다.
INSERT ... ON CONFLICT 명령에 대해 게시는 그 명령에서 나오는 결과 연산을 게시합니다. 결과에 따라 INSERT나 UPDATE로 게시될 수도, 전혀 게시되지 않을 수도 있어요.
MERGE 명령에 대해 게시는 행이 삽입·갱신·삭제될 때마다 INSERT, UPDATE, DELETE를 각각 게시합니다.
루트가 publish_via_partition_root를 true로 설정한 게시로 게시되는 파티션 트리에 테이블을 ATTACH해도 그 테이블의 기존 내용은 복제되지 않아요.
COPY ... FROM 명령은 INSERT 연산으로 게시됩니다.
DDL 연산은 게시되지 않습니다.
WHERE 절 표현식은 복제 연결에 쓰인 역할로 실행됩니다.
예제 (Examples)
두 테이블의 모든 변경을 게시하는 게시 만들기:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
활성 부서의 모든 변경을 게시하는 게시 만들기:
CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);
모든 테이블의 모든 변경을 게시하는 게시 만들기:
CREATE PUBLICATION alltables FOR ALL TABLES;
한 테이블에서 INSERT 연산만 게시하는 게시 만들기:
CREATE PUBLICATION insert_only FOR TABLE mydata
WITH (publish = 'insert');
테이블 users, departments와 스키마 production의 모든 테이블의 모든 변경을 게시하는 게시 만들기:
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
스키마 marketing과 sales의 모든 테이블의 모든 변경을 게시하는 게시 만들기:
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
테이블 users의 모든 변경을 게시하되 user_id와 firstname 컬럼만 복제하는 게시 만들기:
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
호환성 (Compatibility)
CREATE PUBLICATION은 PostgreSQL 확장 기능이에요.
함께 보기 (See Also)
ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION
더 알아보기 (Learn more)
CREATE SUBSCRIPTION: 게시에서 변경을 받아 적용하는 구독을 추가하는 명령.ALTER PUBLICATION: 게시의 정의를 변경하는 명령.