CREATE PUBLICATION
Эта страница переведена при помощи нейросети GigaChat.
CREATE PUBLICATION
— создание новой публикации.
Синтаксис
CREATE PUBLICATION name
[ FOR ALL TABLES
| FOR publication_object [, ... ] ]
[ WITH ( publication_parameter [= value] [, ... ] ) ]
where publication_object is one of:
TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
Описание
CREATE PUBLICATION
создает новую публикацию в текущей базе данных. Имя публикации должно быть уникальным среди всех публикаций в этой базе.
Публикация — это набор таблиц, изменения данных в которых предназначены для логической репликации. Подробнее о том, как публикации вписываются в настройку логической репликации описано в разделе «Публикация».
Параметры
name
- Указывает имя публикации, которая должна быть создана.
FOR TABLE
- Позволяет указать список таблиц, которые включаются в публикацию.
Если перед именем таблицы указано
ONLY
, в публикацию добавляется только сама таблица, без потомков. БезONLY
в публикацию включаются также все дочерние таблицы (если есть). Явное указание*
после имени таблицы подчеркивает, что потомки тоже включены. Однако это не относится к партиционированным таблицам: все их партиции автоматически считаются частью публикации и не добавляются отдельно.Если указано выражение
WHERE
, оно работает как фильтр строк: публикуются только те строки, для которых выражение возвращаетTRUE
. Скобки вокруг выражения обязательны.WHERE
не влияет на командыTRUNCATE
.При указании списка столбцов будут реплицироваться только указанные поля. Если список не задан, публикуются все столбцы, включая добавленные в будущем.
TRUNCATE
это тоже не затрагивает. Смотрите раздел «Списки столбцов» для получения подробной информации о списках столбцов.В публикацию можно включать только постоянные базовые и партиционированные таблицы. Временные, нерегистрируемые, внешние таблицы, материализованные и обычные представления не поддерживаются.
Если используется
FOR TABLE
со списком столбцов, то нельзя одновременно добавлять таблицы черезFOR TABLES IN SCHEMA
— это несовместимо.Если добавить в публикацию партиционированную таблицу, то все ее текущие и будущие партиции автоматически считаются частью публикации. Даже если операция выполняется напрямую над партицией, она будет опубликована от имени корня дерева партиций.
FOR ALL TABLES
- Отмечает, что публикация охватывает все таблицы в базе данных, включая те, что будут созданы в будущем.
FOR TABLES IN SCHEMA
- Отмечает, что публикация охватывает все таблицы в указанных схемах, включая те, что появятся позже.
Несовместимо с использованием списка столбцов. Если указываются схемы, нельзя задавать списки столбцов для отдельных таблиц.
В публикацию попадут только постоянные базовые и партиционированные таблицы из указанных схем. Временные, нерегистрируемые, внешние таблицы, материализованные и обычные представления — игнорируются.
Если публикуется партиционированная таблица через публикацию уровня схемы, то все ее партиции — текущие и будущие — автоматически включаются в публикацию, даже если они находятся в другой схеме. Любые изменения, выполненные напрямую с партицией, также публикуются.
WITH (publication_parameter [=value] [, ... ])
- Определяет опциональные параметры для публикации. Поддерживаются следующие параметры:
publish
(string
) : Определяет, какие DML-операции (изменения данных) будут публиковаться. Значение — список через запятую из:insert
,update
,delete
,truncate
. По умолчанию публикуются все (insert
,update
,delete
,truncate
).
Этот параметр влияет только на операции изменения данных. В частности, начальная синхронизация данных (смотрите раздел «Начальный снимок») для логической репликации не учитывает этот параметр при копировании существующих данных таблицы.
publish_via_partition_root
(boolean
)- Определяет, будут ли изменения в партиционированной таблице публиковаться с использованием идентичности и схемы партиционированной таблицы, а не отдельных разделов, которые фактически изменяются. Последнее является значением по умолчанию. Включив параметр, можно воспроизводить изменения в непартиционированной таблице или партиционированной таблице, состоящей из другого набора разделов.
Может возникнуть ситуация, когда подписка объединяет несколько публикаций. Если партиционированная таблица опубликована какой-либо подпиской, устанавливающей publish_via_partition_root = true
, изменения в этой партиционированной таблице (или в ее секциях) будут опубликованы с использованием идентификатора и схемы этой партиционированной таблицы, а не индивидуальных партиций.
Этот параметр также влияет на то, как выбираются фильтры строк и списки столбцов для секций. Смотрите ниже подробности.
Если параметр включен, операции TRUNCATE
, выполняемые непосредственно с партициями, не реплицируются.
При указании параметра типа boolean
часть = value
может быть пропущена, что эквивалентно указанию TRUE
.
Примечания
Если не указаны FOR TABLE
, FOR ALL TABLES
или FOR TABLES IN SCHEMA
, публикация создается с пустым набором таблиц. Это полезно, если планируется добавить таблицы или схемы позже.
Создание публикации не запускает репликацию, а только определяет логику группировки и фильтрации для будущих подписчиков.
Чтобы создать публикацию, пользователь должен иметь привилегию CREATE
в текущей базе данных. Суперпользователи обходят эту проверку.
Для добавления таблицы пользователь должен быть ее владельцем. FOR ALL TABLES
и FOR TABLES IN SCHEMA
требуют прав суперпользователя.
Таблицы, в которых публикуются UPDATE
и/или DELETE
, должны иметь определенное REPLICA IDENTITY
, иначе эти операции будут запрещены.
Если используется список столбцов, он обязательно должен включать столбцы, входящие в REPLICA IDENTITY
, чтобы UPDATE
/DELETE
публиковались. Нет ограничений на список столбцов, если публикация публикует только операции INSERT
.
Ограничение WHERE
должно использовать только столбцы REPLICA IDENTITY
, чтобы можно было опубликовать операции UPDATE
и DELETE
. Для публикации операций INSERT
в выражении WHERE
может использоваться любой столбец.
Выражение в WHERE
должно быть простым: без пользовательских функций, операторов, типов, сопоставлений с учетом регистра, встроенных функций, не являющихся неизменными, или ссылок на системные столбцы.
Если таблица уже входит в публикацию через FOR TABLES IN SCHEMA
, фильтр WHERE
, указанный для нее отдельно, не применяется.
Если publish_via_partition_root = true
, то для опубликованных партиционированных таблиц фильтр строк и список столбцов для каждой партиции берутся из опубликованной партиционированной таблицы. Иначе — из самой партиции (по умолчанию). Смотрите раздел «Фильтры строк» для получения подробной информации о фильтрах строк.
Для INSERT ... ON CONFLICT
публикуется операцию, которая является результатом этой команды. В зависимости от результата она может быть опубликована либо как INSERT
, либо как UPDATE
, либо вообще не будет опубликована.
Для MERGE
публикуется соответствующая операция для каждой строки: INSERT
, UPDATE
или DELETE
.
ATTACH
таблицы к дереву партиционирования, корень которого включен в публикацию со свойством параметра publish_via_partition_root
равным true
, не приводит к репликации существующего содержимого таблицы.
COPY ... FROM
команда публикуется как INSERT
операции. DDL операции не публикуются.
Выражение WHERE
исполняется от имени роли, используемой для подключения репликации.
Примеры
Создание публикации, которая публикует все изменения в двух таблицах:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
Создание публикации, которая публикует все изменения из активных отделов:
CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);
Создание публикации, которая публикует все изменения во всех таблицах:
CREATE PUBLICATION alltables FOR ALL TABLES;
Создание публикации, которая публикует только операции INSERT
в одной таблице:
CREATE PUBLICATION insert_only FOR TABLE mydata
WITH (publish = 'insert');
Создание публикации, которая публикует все изменения для таблиц users
, departments
и все изменения для всех таблиц, присутствующих в схеме production
:
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
Создание публикации, которая публикует все изменения для всех таблиц, присутствующих в схемах marketing
и sales
:
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
Создание публикации, которая публикует все изменения для таблицы users
, но реплицирует только столбцы user_id
и firstname
:
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
Совместимость
CREATE PUBLICATION
является расширением PostgreSQL.
Смотрите также
ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION