ALTER PUBLICATION
ALTER PUBLICATION
ALTER PUBLICATION은 게시(publication)의 정의를 바꾸는 명령이에요. 게시에 포함되는 테이블·스키마 목록을 바꾸고, 게시 속성·소유자·이름을 변경할 수 있어요.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_drop_object [, ...]
ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )
ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION name RENAME TO new_name
where publication_object is one of:
TABLE table_and_columns [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and publication_drop_object is one of:
TABLE [ ONLY ] table_name [ * ] [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and table_and_columns is:
[ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]
설명 (Description)
ALTER PUBLICATION 명령은 게시의 속성을 변경할 수 있어요.
처음 세 가지 변형은 게시의 일부가 되는 테이블·스키마 목록을 바꿔요. SET 절은 게시의 테이블·스키마 목록을 지정된 목록으로 교체해요. 기존에 게시에 있던 테이블·스키마는 제거돼요. ADD와 DROP 절은 게시에 테이블·스키마를 추가하거나 제거해요. 이미 구독이 걸려 있는 게시에 테이블·스키마를 추가하려면 구독 쪽에서 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 동작을 해야 실제로 반영된답니다. 또 DROP TABLES IN SCHEMA는 FOR TABLE/ADD TABLE로 지정된 스키마 테이블은 드롭하지 않는다는 점도 유의하세요.
문법에 나열된 이 명령의 네 번째 변형은 CREATE PUBLICATION에서 지정하는 모든 게시 속성을 변경할 수 있어요. 명령에서 언급되지 않은 속성은 이전 설정을 그대로 유지해요.
나머지 변형은 게시의 소유자와 이름을 변경해요.
ALTER PUBLICATION을 쓰려면 게시의 소유자여야 해요. 게시에 테이블을 추가하려면 그 테이블의 소유자도 되어야 해요. 게시에 ADD TABLES IN SCHEMA와 SET TABLES IN SCHEMA를 하려면 호출 사용자가 슈퍼유저여야 해요. 소유자를 바꾸려면 새 소유 역할로 SET ROLE 할 수 있어야 하고, 그 역할이 데이터베이스에 대한 CREATE 권한도 가져야 해요. 또한 FOR ALL TABLES 또는 FOR TABLES IN SCHEMA 게시의 새 소유자는 슈퍼유저여야 해요. 다만 슈퍼유저는 이런 제약과 무관하게 게시의 소유권을 바꿀 수 있어요.
게시가 컬럼 목록을 가진 테이블도 게시하면서 어떤 스키마를 추가/설정하는 것은 지원되지 않아요. 그 반대도 마찬가지예요.
파라미터 (Parameters)
name — 정의를 변경할 기존 게시의 이름이에요.
table_name — 기존 테이블의 이름이에요. 테이블 이름 앞에 ONLY를 지정하면 그 테이블만 영향을 받아요. ONLY를 지정하지 않으면 테이블과 모든 하위 테이블(있다면)이 영향을 받아요. 선택적으로 테이블 이름 뒤에 *를 붙여 하위 테이블이 포함됨을 명시적으로 나타낼 수 있어요.
선택적으로 컬럼 목록을 지정할 수 있어요. 자세한 내용은 CREATE PUBLICATION을 참고하세요. 같은 테이블이 서로 다른 컬럼 목록으로 게시된 여러 게시를 구독하는 것은 지원되지 않는다는 점에 유의하세요. 컬럼 목록 변경 시 발생할 수 있는 문제에 대해서는 "Warning: Combining Column Lists from Multiple Publications"를 참고하세요.
선택적 WHERE 절을 지정하면 표현식이 false 또는 null로 평가되는 행은 게시되지 않아요. 표현식 주위에 괄호가 필요하다는 점에 유의하세요. 표현식은 복제 연결에 사용되는 역할로 평가돼요.
schema_name — 기존 스키마의 이름이에요.
SET ( publication_parameter [= value] [, ... ] ) — 이 절은 원래 CREATE PUBLICATION으로 설정된 게시 파라미터를 변경해요. 자세한 내용은 그 문서를 참고하세요.
주의 (Caution)
publish_via_partition_root 파라미터를 변경하면 게시되는 테이블의 정체와 스키마가 바뀌어 구독자 쪽에서 데이터 손실이나 중복이 발생할 수 있어요. 이는 파티션 루트 테이블이 복제 대상으로 지정된 경우에만 일어난다는 점에 유의하세요.
이 문제는 ALTER PUBLICATION ... SET 이후 ALTER SUBSCRIPTION ... REFRESH PUBLICATION을 실행할 때까지 파티션 리프 테이블을 수정하지 않고, copy_data = off 옵션으로만 리프레시하면 피할 수 있어요.
new_owner — 게시의 새 소유자 사용자 이름이에요.
new_name — 게시의 새 이름이에요.
예제 (Examples)
게시가 삭제와 갱신만 게시하도록 변경하려면:
ALTER PUBLICATION noinsert SET (publish = 'update, delete');
게시에 테이블 몇 개를 추가하려면:
ALTER PUBLICATION mypublication ADD TABLE users (user_id, firstname), departments;
테이블에 대해 게시되는 컬럼 집합을 변경하려면:
ALTER PUBLICATION mypublication SET TABLE users (user_id, firstname, lastname), TABLE departments;
게시 sales_publication에 스키마 marketing과 sales를 추가하려면:
ALTER PUBLICATION sales_publication ADD TABLES IN SCHEMA marketing, sales;
게시 production_publication에 테이블 users, departments와 스키마 production을 추가하려면:
ALTER PUBLICATION production_publication ADD TABLE users, departments, TABLES IN SCHEMA production;
호환성 (Compatibility)
ALTER PUBLICATION은 PostgreSQL 확장 기능이에요.
더 알아보기 (Learn more)
SET은 목록을 교체하고,ADD/DROP은 목록의 일부를 추가·제거해요.- 이미 구독 중인 게시에 테이블·스키마를 추가하면 구독 쪽에서
ALTER SUBSCRIPTION ... REFRESH PUBLICATION을 실행해야 반영돼요. FOR ALL TABLES/FOR TABLES IN SCHEMA게시의 새 소유자는 슈퍼유저여야 해요.