28.1. Публикация#

28.1. Публикация

28.1. Публикация #

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

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

Публикации могут выбрать ограничить изменения, которые они производят, до любой комбинации INSERT, UPDATE, DELETE и TRUNCATE, аналогично тому, как триггеры срабатывают по определенным типам событий. По умолчанию реплицируются все типы операций. Эти спецификации публикации применяются только для операций DML; они не влияют на начальную копию синхронизации данных. (Фильтры строк не имеют эффекта для TRUNCATE. См. Раздел 28.4).

Каждая публикация может иметь несколько подписчиков.

Публикация создается с использованием команды CREATE PUBLICATION и может быть изменена или удалена позже с помощью соответствующих команд.

Отдельные таблицы могут быть добавлены или удалены динамически с помощью ALTER PUBLICATION. Операции ADD TABLE и DROP TABLE являются транзакционными, поэтому репликация таблица будет начата или закончена с определённым снимком после фиксации транзакции.

28.1.1. Репликационный идентификатор #

Опубликованная таблица должна иметь настроенный репликационный идентификатор, чтобы была возможность реплицировать операции UPDATE и DELETE, позволяя идентифицировать соответствующие строки для обновления или удаления на стороне подписчика.

По умолчанию используется первичный ключ, если он существует. Другой уникальный индекс (при соблюдении определённых дополнительных требований) также может быть установлен в качестве идентификатора реплики. Если в таблице нет подходящего ключа, то можно установить идентификатор реплики FULL, и тогда вся строка будет использоваться в качестве ключа. Когда указан идентификатор реплики FULL, на стороне подписчика для поиска строк можно использовать индексы. Подходят нечастичные индексы btree или хеш-индексы, самое левое поле которых должно быть столбцом (а не выражением), ссылающимся на столбец опубликованной таблицы. Эти ограничения на свойства неуникальных индексов соответствуют некоторым ограничениям, которые применяются к первичным ключам. Если подходящих индексов нет, поиск на стороне подписчика может быть очень неэффективным, поэтому идентификатор реплики FULL следует использовать только если невозможно применить другое решение.

Если на стороне публикации установлена репликационный идентификатор, отличный от FULL, на стороне подписчика также должен быть установлен репликационный идентификатор, состоящий из того же или меньшего количества столбцов.

Таблицы с репликационным идентификатором NOTHING, DEFAULT без первичного ключа или USING INDEX с удалённым индексом не могут поддерживать операции UPDATE или DELETE при включении в публикацию, реплицирующую эти операции. Попытка выполнить такие операции приведёт к ошибке на стороне публикации.

Операции INSERT выполняются независимо от репликационного идентификатора.

См. ALTER TABLE...REPLICA IDENTITY для получения подробной информации о том, как назначить репликационый идентификатор.