CREATE PUBLICATION#

CREATE PUBLICATION

CREATE PUBLICATION

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 добавляет новую публикацию в текущую базу данных. Имя публикации должно отличаться от имени любой существующей публикации в текущей базе данных.

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

Параметры

name #

Название новой публикации.

FOR TABLE #

Указывает список таблиц, которые нужно добавить в публикацию. Если перед именем таблицы указано слово ONLY, то в публикацию добавляется только эта таблица. Если слово ONLY не указано, то в публикацию добавляется таблица и все ее наследники (если они есть). Дополнительно, после имени таблицы можно указать символ *, чтобы явно указать, что включены наследники таблицы. Однако это не относится к секционированной таблице. секции секционированной таблицы всегда неявно считаются частью публикации, поэтому они никогда не добавляются явно в публикацию.

Если указано необязательное предложение WHERE, оно определяет выражение фильтра строки. Строки, для которых выражение expression вычисляется как false или null, не будут опубликованы. Обратите внимание, что вокруг выражения требуются скобки. Это не влияет на команды TRUNCATE.

Когда указывается список столбцов, реплицируются только именованные столбцы. Если список столбцов не указан, все столбцы таблицы реплицируются через данную публикацию, включая любые позднее добавленные столбцы. Это не влияет на команды TRUNCATE. См. Раздел 29.4 для получения подробной информации о списках столбцов.

Только постоянные базовые таблицы и секционированные таблицы могут быть частью публикации. Временные таблицы, незарегистрированные таблицы, внешние таблицы, материализованные представления и обычные представления не могут быть частью публикации.

Указание списка столбцов при публикации, когда публикуется также 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'.

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

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. Фильтр строк позволяет использовать простые выражения, не содержащие пользовательских функций, пользовательских операторов, пользовательских типов, пользовательских правил сортировки, непостоянных встроенных функций или ссылок на системные столбцы.

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

Для опубликованных секционированных таблиц фильтр строк для каждой секции берется из опубликованной секционированной таблицы, если параметр публикации publish_via_partition_root равен true, или из самой секции, если он равен false (по умолчанию). См. Раздел 29.3 для получения подробной информации о фильтрах строк. Аналогично, для опубликованных секционированных таблиц список столбцов для каждой секции берется из опубликованной секционированной таблицы, если параметр публикации 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 - это расширение Tantor BE.