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
. По умолчанию публикуются все действия, так что этот параметр имеет значение по умолчанию'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.