CREATE PUBLICATION
CREATE PUBLICATION — создать публикацию
Синтаксис
CREATE PUBLICATIONимя[ FOR TABLE [ ONLY ]имя_таблицы[ * ] [, ...] | FOR ALL TABLES ] [ WITH (параметр_публикации[=значение] [, ... ] ) ]
Описание
CREATE PUBLICATION создаёт новую публикацию в текущей базе данных. Имя публикации должно отличаться от имён других существующих публикаций в текущей базе.
Публикация по сути является группой таблиц, изменения в данных которых должны реплицироваться с использованием логической репликации. Подробнее о том, как публикации вписываются в схему логической репликации, рассказывается в Разделе 30.1.
Параметры
имяИмя новой публикации.
FOR TABLEЗадаёт список таблиц, добавляемых в публикацию. Если перед именем таблицы указано
ONLY, в публикацию добавляется только заданная таблица. БезONLYдобавляется и заданная таблица, и все её потомки (если таковые есть). После имени таблицы можно добавить необязательное указание*, чтобы явно обозначить, что должны включаться и все дочерние таблицы.В публикацию могут включаться только постоянные базовые таблицы. Временные, нежурналируемые, сторонние и секционированные таблицы, а также материализованные и обычные представления не могут входить в публикацию. Для реплицирования секционированной таблицы в публикацию нужно добавить её отдельные секции.
FOR ALL TABLESУстанавливает, что данная публикация охватывает изменения во всех таблицах в базе данных, включая таблицы, которые будут созданы позже.
WITH (параметр_публикации[=значение] [, ... ] )В этом предложении могут задаваться следующие необязательные параметры публикации:
publish(string)Этот параметр определяет, какие операции DML будет передавать новая публикация её подписчикам. В качестве его значения через запятую задаётся список операций из следующих:
insert,updateиdelete. По умолчанию публикуются все действия, так что этот параметр имеет значение по умолчанию'insert, update, delete'.
Замечания
Если не задано ни FOR TABLE, ни FOR ALL TABLES, публикация создаётся с пустым набором таблиц. Это полезно, если таблицы будут добавляться позднее.
Создание публикации не влечёт немедленный запуск репликации. Эта операция только определяет логику группирования и фильтрации для будущих подписчиков.
Чтобы создать публикацию, пользователь должен иметь право CREATE в текущей базе данных. (Разумеется, на суперпользователей это условие не распространяется.)
Чтобы добавить таблицу в публикацию, пользователь должен иметь права владельца этой таблицы. Для использования предложения FOR ALL TABLES пользователь должен быть суперпользователем.
Таблицы, добавляемые в публикацию, которая охватывает операции UPDATE и/или DELETE, должны иметь свойство REPLICA IDENTITY. В противном случае отслеживание этих операций для таблиц будет запрещено.
Для команды INSERT ... ON CONFLICT публикация будет выдавать операцию, к которой фактически сводится команда. Поэтому в зависимости от исхода команды, она может быть опубликована либо как INSERT, либо как UPDATE, либо не будет опубликована вовсе.
Команды COPY ... FROM публикуются в виде операций INSERT.
Команда TRUNCATE и операции 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.

