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

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

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

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

Чтобы можно было реплицировать операции UPDATE и DELETE, в публикуемой таблице должен быть настроен «репликационный идентификатор» для нахождения соответствующих строк для изменения или удаления на стороне подписчика. По умолчанию это первичный ключ, если он создан. Также репликационным идентификатором можно назначить другой уникальный индекс (с некоторыми дополнительными условиями). Если в таблице нет подходящего ключа, в качестве репликационного идентификатора можно задать «full», что будет означать, что ключом будет вся строка. Это, однако, очень неэффективно и должно применяться как крайняя мера, если другого решения нет. Если на стороне публикации выбран репликационный идентификатор, отличный от «full», то идентификатор, состоящий из того же или меньшего количества столбцов, также должен быть определён на стороне подписчика. Подробнее о назначении репликационного идентификатора рассказывается в REPLICA IDENTITY. Если в публикацию, в которой реплицируются операции UPDATE и DELETE, добавляется таблица без репликационного идентификатора, то последующие команды UPDATE и DELETE на стороне публикации вызовут ошибку. Команды INSERT могут выполняться вне зависимости от такого идентификатора.

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

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

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