CREATE PUBLICATION
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'
.publish_via_partition_root
(boolean
)Этот параметр определяет, будут ли изменения в секции секционированной таблицы, включённой в публикацию, публиковаться как произошедшие в секционированной таблице (с её именем и схемой), а не в той секции, где они фактически имели место (это поведение по умолчанию). Включение этого параметра позволяет реплицировать изменения в несекционированную таблицу или в таблицу, состоящую из другого набора секций.
Когда этот параметр включён, операции
TRUNCATE
, выполняемые непосредственно с секциями, не реплицируются.
Примечания
Если не задано ни FOR TABLE
, ни FOR ALL TABLES
, публикация создаётся с пустым набором таблиц. Это полезно, если таблицы будут добавляться позднее.
Создание публикации не влечёт немедленный запуск репликации. Эта операция только определяет логику группирования и фильтрации для будущих подписчиков.
Чтобы создать публикацию, пользователь должен иметь право CREATE
в текущей базе данных. (Разумеется, на суперпользователей это условие не распространяется.)
Чтобы добавить таблицу в публикацию, пользователь должен иметь права владельца этой таблицы. Для использования предложения FOR ALL TABLES
пользователь должен быть суперпользователем.
Таблицы, добавляемые в публикацию, которая охватывает операции UPDATE
и/или DELETE
, должны иметь свойство REPLICA IDENTITY
. В противном случае отслеживание этих операций для таблиц будет запрещено.
Для команды INSERT ... ON CONFLICT
публикация будет выдавать операцию, к которой сводится команда. В зависимости от исхода команды, она может быть опубликована либо как INSERT
, либо как UPDATE
, либо не будет опубликована вовсе.
Присоединение (ATTACH
) таблицы к дереву секционирования, корень которого включён в публикацию со свойством параметра publish_via_partition_root
равным true
, не приводит к репликации существующего содержимого таблицы.
Команды COPY ... FROM
публикуются в виде операций INSERT
.
Операции DDL не публикуются.
Примеры
Создание публикации, охватывающей изменения в двух таблицах:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
Создание публикации, охватывающей все изменения во всех таблицах:
CREATE PUBLICATION alltables FOR ALL TABLES;
Создание публикации, охватывающей только операции INSERT
в одной таблице:
CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');
Совместимость
CREATE PUBLICATION
является расширением PostgreSQL.