CREATE PUBLICATION — 새 발행 정의
CREATE PUBLICATION이름
[ FOR TABLE [ ONLY ]테이블이름
[ * ] [, ...] | FOR ALL TABLES ] [ WITH (발행_매개변수
[=값
] [, ... ] ) ]
CREATE PUBLICATION
명령은
현재 데이터베이스에서 새 발행을 만든다.
이 발행 이름은 데이터베이스 내에서 유일해야 한다.
발행이란 논리 복제에서 사용할 그 대상 테이블 목록이다. 논리 복제 발행에 대한 설명은 31.1절에서 하고 있다.
이름
새로 만들 발행 이름.
FOR TABLE
발행에 포함할 테이블 목록.
테이블 이름 앞에 ONLY
키워드를 추가하면,
그 테이블의 하위 테이블을 포함하지 않고 그 테이블만 대상으로 하고,
ONLY
키워드가 없으면 그 테이블 포함, 하위 테이블들도
모두 발행 대상이 된다. 선택적으로
가독성을 높이기 위해 *
문자를 추가해서,
하위 테이블 모두를 포함한다고 할 수도 있다.
이 목록에 추가 될 수 있는 테이블은 일반 테이블 뿐이다. 임시 테이블, 언로그드 테이블, 외부 테이블, 구체화한 뷰, 일반 뷰, 파티션 상위 테이블 이 모두 발행 목록에 추가할 수 없다. 파티션 테이블인 경우는 그 하위 일반 테이블들을 대상으로 각각 추가해야 한다.
FOR ALL TABLES
해당 데이터베이스 내 모든 테이블(앞으로 만들어지는 테이블도 포함해서)을 발행 대상 테이블로 지정한다.
WITH ( 발행_매개변수
[= 값
] [, ... ] )
이 구문으로 발행 옵션을 설정한다. 사용할 수 있는 매개 변수는 다음과 같다:
publish
(string
)
어떤 DML 작업에 대해서 발행할 것인지를 지정한다.
사용할 수 있는 값은 insert
, update
,
delete
, truncate
네 가지며,
쉼표로 구분해서 여러 개 사용할 수 있다.
기본값은 모든 작업을 대상으로 하는
'insert, update, delete, truncate'
.
FOR TABLE
, FOR ALL
TABLES
두 옵션 모두 사용하지 않는다면, 발행 목록을 비워둔 채로
발행을 만든다. 이 방법은 나중에 필요한 테이블만 따로 추가하려고 할 때
유용하게 사용된다.
이 발행을 만든다고 바로 복제를 시작하지는 않는다. 향후 구독 서버에서 구독을 할 수 있는 발행 정보를 만드는 일만 한다.
발행을 만드려면, 해당 데이터베이스에 대해서
CREATE
권한이 있어야 한다. (슈퍼유저는 예외)
발행에 테이블을 추가하려면, 해당 테이블의 소유주와
이 명령을 실행하는 사용자가 같거나, 상위 권한이 있는 사용자여야 한다.
FOR ALL TABLES
구문을 사용하는 경우는
슈퍼유저여야 한다.
UPDATE
, DELETE
작업을
발행하는 테이블은 그 테이블 속성으로 REPLICA IDENTITY
속성이 활성화 되어 있어야 한다.
그렇지 않으면, 발행 목록에 포함될 수 없다.
발행 서버에서 있었던 INSERT ... ON CONFLICT
작업은
구독 서버로 그 작업의 결과 작업이 전달된다. 즉,
INSERT
작업이 될 수도 있고,
UPDATE
작업이 될 수도 있고,
아니면, 아에 아무 작업도 전달되지 않을 수 있다.
COPY ... FROM
작업은
INSERT
작업으로 바뀌어 전달된다.
DDL 구문은 발행되지 않는다.
두 테이블의 모든 DML 작업에 대해서 발행 만들기:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
모든 테이블의 모든 DML 작업에 대해서 발행 만들기:
CREATE PUBLICATION alltables FOR ALL TABLES;
한 테이블의 INSERT
작업에 대해서만
발행 만들기:
CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');
CREATE PUBLICATION
구문은 PostgreSQL
확장 기능이다.