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