CREATE PUBLICATION
CREATE PUBLICATION — создать публикацию
Синтаксис
CREATE PUBLICATIONимя[ FOR TABLE [ ONLY ]имя_таблицы[ * ] [, ...] | FOR ALL TABLES ] [ WITH (параметр_публикации[=значение] [, ... ] ) ]
Описание
CREATE PUBLICATION создаёт новую публикацию в текущей базе данных. Имя публикации должно отличаться от имён других существующих публикаций в текущей базе.
Публикация по сути является группой таблиц, изменения в данных которых должны реплицироваться с использованием логической репликации. Подробнее о том, как публикации вписываются в схему логической репликации, рассказывается в Разделе 29.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 является расширением Postgres Pro.