CREATE PUBLICATION

CREATE PUBLICATION — определить новую публикацию


Синтаксис

CREATE PUBLICATION имя
    [ FOR ALL TABLES
      | FOR объект_публикации [, ... ] ]
    [ WITH ( параметр_публикации [= значение] [, ... ] ) ]

где объектом_публикации может быть:

    TABLE [ ONLY ] имя_таблицы [ * ] [ ( имя_столбца [, ... ] ) ] [ WHERE ( выражение ) ] [, ... ]
    TABLES IN SCHEMA { имя_схемы | CURRENT_SCHEMA } [, ... ]

Описание

Команда CREATE PUBLICATION добавляет новую публикацию в текущую базу данных. Имя публикации должно отличаться от имени других существующих публикаций в текущей базе данных.

Публикация — это, по существу, группа таблиц, изменения данных которых подлежат логической репликации. Дополнительную информацию о том, как публикации вписываются в параметры логической репликации, см. в разделе Публикация.


Параметры

имя

Имя новой публикации.

FOR TABLE

Задает список таблиц для добавления в публикацию. Если перед именем таблицы указывается ONLY, в публикацию добавляется только заданная таблица. Без ONLY добавляется и заданная таблица, и все ее потомки (если таковые имеются). После имени таблицы можно добавить необязательное указание *, чтобы явно обозначить, что включены дочерние таблицы. Однако это не распространяется на партиционированные таблицы. Партиции партиционированных таблиц всегда неявно считаются частью публикации, поэтому никогда не добавляются в нее явно.
Если указывается необязательное предложение WHERE, оно определяет выражение фильтра строк. Строки, для которых выражение вычисляется в false или NULL, публиковаться не будут. Обратите внимание, что выражение нужно заключить в скобки. Это предложение не влияет на команды TRUNCATE.
Если задается список столбцов, реплицируются только перечисленные столбцы. Без списка через эту публикацию реплицируются все столбцы таблицы, включая добавленные позже. Этот список не влияет на команды TRUNCATE. Подробную информацию о списках столбцов см в разделе Списки столбцов.
Только постоянные базовые и партиционированные таблицы могут быть частью публикации. Временные, нежурналируемые и сторонние таблицы, а также материализованные и обычные представления не могут быть частью публикации.
Возможность задать список столбцов, когда публикация также публикует все таблицы в схеме (FOR TABLES IN SCHEMA), не поддерживается.
Когда в публикацию добавляется партиционированная таблица, все ее существующие и будущие партиции неявно считаются частью этой публикации. Поэтому даже операции, выполняемые непосредственно с партицией, тоже публикуются через публикации, в которые входит ее родительская таблица.

FOR ALL TABLES

Помечает публикацию как реплицирующую изменения для всех таблиц в базе данных, включая таблицы, создаваемые в будущем.

FOR TABLES IN SCHEMA

Помечает публикацию как реплицирующую изменения для всех таблиц в заданном списке схем, включая таблицы, создаваемые в будущем.
Возможность указать схему, когда публикация также публикует таблицу со списком столбцов, не поддерживается.
Только постоянные базовые и партиционированные таблицы, присутствующие в схеме, могут быть частью публикации. Временные, нежурналируемые и сторонние таблицы, а также материализованные и обычные представления из этой схемы не могут быть частью публикации.
Когда партиционированная таблица публикуется посредством публикации на уровне схемы, все ее существующие и будущие партиции неявно считаются частью этой публикации, независимо от того, находятся они в публикуемой схеме или нет. Поэтому даже операции, выполняемые непосредственно с партицией, тоже публикуются через публикации, в которые входит ее родительская таблица.

WITH ( параметр_публикации [= значение] [, ... ] )

В этом предложении указываются необязательные параметры для публикации. Поддерживаются следующие параметры:

  • publish (string)
    Этот параметр определяет, какие операции DML будут опубликованы новой публикацией для подписчиков. В качестве его значения через запятую задается список операций. Разрешены следующие операции: insert, update, delete и truncate. По умолчанию публикуются все действия, поэтому значение по умолчанию для этого параметра равно 'insert, update, delete, truncate'.
    Этот параметр влияет только на операции DML. В частности, во время начальной синхронизации данных (см. подраздел Начальный снимок) для логической репликации этот параметр не учитывается при копировании существующих данных таблиц.

  • publish_via_partition_root (boolean)
    Этот параметр определяет, будут ли изменения в содержащейся в публикации партиционированной таблице (или в ее партициях) опубликованы с именем и схемой этой партиционированной таблицы, а не ее отдельных партиций, где эти изменения на самом деле произошли (второе — поведение по умолчанию). Включение этого параметра позволяет реплицировать изменения в непартиционированную таблицу или в партиционированную таблицу, состоящую из другого набора партиций.
    Бывают случаи, когда в подписке объединяются несколько публикаций. Если партиционированная таблица публикуется в любой публикации, на которую оформлена подписка с publish_via_partition_root = true, изменения в этой партиционированной таблице (или в ее партициях) будут опубликованы с указанием идентификатора и схемы этой партиционированной таблицы, а не отдельных партиций.
    Кроме того, этот параметр влияет на то, какие фильтры строк и списки столбцов выбираются для партиций; подробную информацию см. ниже.
    Если этот параметр включен, операции TRUNCATE, выполняемые непосредственно с партициями, не реплицируются.

При указании параметра типа boolean, часть = значение можно опустить, что равнозначно указанию TRUE.


Примечания

Если не заданы FOR TABLE, FOR ALL TABLES или FOR TABLES IN SCHEMA, публикация создается с пустым набором таблиц. Это удобно, если таблицы будут добавлены позже.

Создание публикации не запускает репликацию. Оно лишь определяет логику группировки и фильтрации для будущих подписчиков.

Чтобы создать публикацию, необходимо иметь право CREATE в текущей базе данных. (Разумеется, суперпользователи эту проверку игнорируют.)

Чтобы добавить таблицу в публикацию, вызывающий пользователь должен быть владельцем таблицы. Предложения FOR ALL TABLES и FOR TABLES IN SCHEMA требуют, чтобы вызывающий пользователь был суперпользователем.

Таблицы, добавленные в публикацию, которая публикует операции UPDATE и/или DELETE, должны иметь свойство REPLICA IDENTITY. В противном случае данные операции для этих таблиц будут запрещены.

Чтобы были опубликованы операции UPDATE и DELETE, список столбцов должен включать столбцы идентификатора реплики (REPLICA IDENTITY). Если публикация публикует только операции INSERT, ограничений для списка столбцов нет.

Чтобы были опубликованы операции UPDATE и DELETE, выражение фильтра строк (т. е. предложение WHERE) должно содержать только столбцы, входящие в идентификатор реплики (REPLICA IDENTITY). Для публикации операций INSERT в выражении WHERE может использоваться любой столбец. В фильтре строк допускаются простые выражения, не имеющие пользовательских функций, пользовательских операторов, пользовательских типов, пользовательских правил сортировки, а также непостоянных встроенных функций или ссылок на системные столбцы.

Фильтр строк для таблицы становится избыточным, если указано FOR TABLES IN SCHEMA и таблица принадлежит заданной схеме.

Для опубликованных партиционированных таблиц фильтр строк для каждой партиции берется из опубликованной партиционированной таблицы, если параметр публикации publish_via_partition_root равен true, или из самой партиции, если он равен false (по умолчанию). Подробную информацию о фильтрах строк см. в разделе Фильтры строк. Аналогично для опубликованных партиционированных таблиц список столбцов для каждой партиции берется из опубликованной партиционированной таблицы, если параметр публикации publish_via_partition_root равен true, или из самой партиции, если он равен false.

Для команды 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 является расширением QHB.


См. также

ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION