CREATE PUBLICATION — создание новой публикации
CREATE PUBLICATIONname[ FOR ALL TABLES | FORpublication_object[, ... ] ] [ WITH (publication_parameter[=значение] [, ... ] ) ] гдеpublication_objectодно из следующих: TABLE [ ONLY ]table_name[ * ] [ (column_name[, ... ] ) ] [ WHERE (expression) ] [, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ]
CREATE PUBLICATION Добавляет новую публикацию
в текущую базу данных. Имя публикации должно отличаться от имени любой существующей публикации в текущей базе данных.
Публикация представляет собой группу таблиц, изменения данных в которых предназначены для репликации с помощью логической репликации. См. Раздел 3.14.1 для получения подробных сведений о том, как публикации встраиваются в механизм логической репликации.
name #Имя новой публикации.
FOR TABLE #
Определяет список таблиц для добавления в публикацию. Если
ONLY указано перед именем таблицы, в публикацию добавляется только эта таблица. Если ONLY не
указано, добавляется сама таблица и все её дочерние таблицы (при их наличии).
Дополнительно * можно указать после имени таблицы, чтобы явно обозначить включение дочерних таблиц. Однако это не относится к секционированным таблицам. Секции секционированной таблицы всегда неявно считаются частью публикации, поэтому они никогда не добавляются в публикацию явно.
Если указано необязательное предложение WHERE , оно определяет
фильтр строк выражение. Строки, для
которых expression
результат вычисления выражения ложен (false) или равен null, не будут опубликованы. Обратите внимание, что выражение должно быть заключено в круглые скобки. Это не влияет на
TRUNCATE команды.
Если указан список столбцов, реплицируются только перечисленные столбцы. Если список столбцов не задан, через данную публикацию реплицируются все столбцы таблицы, включая те, что будут добавлены позже. Это не
влияет на TRUNCATE команды. Подробности о списках столбцов приведены в
Раздел 3.14.5 for details about column lists.
В состав публикации могут входить только постоянные базовые таблицы и секционированные таблицы. Временные таблицы, нежурналируемые таблицы, сторонние таблицы, материализованные представления и обычные представления не могут быть частью публикации.
Указание списка столбцов, когда публикация также включает
FOR TABLES IN SCHEMA не поддерживается.
При добавлении секционированной таблицы в публикацию все её существующие и будущие секции неявно включаются в состав этой публикации. Таким образом, даже операции, выполняемые непосредственно в секции, также публикуются через публикации, в которые входят её предки.
FOR ALL TABLES #Помечает публикацию как реплицирующую изменения для всех таблиц в базе данных, включая таблицы, которые будут созданы в будущем.
FOR TABLES IN SCHEMA #Помечает публикацию как реплицирующую изменения для всех таблиц в указанном списке схем, включая таблицы, которые будут созданы в будущем.
Указание схемы не поддерживается, если публикация также включает таблицу со списком столбцов.
В состав публикации включаются только постоянные базовые таблицы и секционированные таблицы, находящиеся в данной схеме. Временные таблицы, нежурналируемые таблицы, сторонние таблицы, материализованные представления и обычные представления из схемы не будут включены в состав публикации.
Когда секционированная таблица публикуется через публикацию уровня схемы, все её существующие и будущие секции неявно считаются частью публикации независимо от того, принадлежат ли они к схеме публикации или нет. Таким образом, даже операции, выполняемые непосредственно в секции, также транслируются через публикации, в состав которых входят родительские таблицы.
WITH ( publication_parameter [= значение] [, ... ] ) #Данное предложение определяет необязательные параметры публикации. Поддерживаются следующие параметры:
publish (string) #
Этот параметр определяет, какие операции DML будут передаваться
в рамках новой публикации подписчикам. Значение представляет собой
разделенный запятыми список операций. Допустимые операции:
insert, update,
delete, а также truncate.
По умолчанию публикуются все действия,
поэтому значением по умолчанию для данного параметра является
'insert, update, delete, truncate'.
Этот параметр влияет только на операции DML. В частности, начальная синхронизация данных (см. Раздел 3.14.8.1) для логической репликации не учитывает данный параметр при копировании существующих данных таблиц.
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 defined. В противном случае выполнение этих операций для таких таблиц будет запрещено.
Любой список столбцов должен включать REPLICA IDENTITY столбцы
для того чтобы UPDATE или DELETE
операции, подлежащие публикации. Ограничения на список столбцов отсутствуют, если публикация публикует только INSERT операции.
Выражение фильтра строк (т. е. предложение WHERE предложение) должно содержать только те столбцы, которые охвачены REPLICA IDENTITY, для того чтобы UPDATE и DELETE операции могли быть опубликованы. Для публикации INSERT операций в предложении может быть использован любой столбец WHERE выражение. Фильтр строк допускает простые выражения, не содержащие пользовательских функций, операторов, типов, правил сортировки, изменчивых (non-immutable) встроенных функций или ссылок на системные столбцы.
Фильтр строк для таблицы становится избыточным, если указано
FOR TABLES IN SCHEMA, и таблица принадлежит к соответствующей схеме.
Для публикуемых секционированных таблиц фильтр строк каждой секции берется из опубликованной секционированной таблицы, если параметр публикации publish_via_partition_root имеет значение true, либо из самой секции, если оно равно false (по умолчанию). См. Раздел 3.14.4 для получения подробной информации о фильтрах строк. Аналогично, для опубликованных секционированных таблиц список столбцов для каждой секции берется из опубликованной секционированной таблицы, если параметр публикации 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 является Digital Q.DataBase
расширением.