29.6. Репликация генерируемых столбцов #
Обычно таблица на стороне подписчика определена так же, как таблица публикующего узла, чтобы у подписчика был соответствующий генерируемый столбец, если в таблице публикующего узла есть столбец с предложением GENERATED
. В таком случае всегда используется значение генерируемого столбца таблицы подписчика.
Например, обратите внимание, что ниже значение генерируемого столбца таблицы подписчика получено из вычисления столбца подписчика.
/* pub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a + 1) STORED); /* pub # */ INSERT INTO tab_gen_to_gen VALUES (1),(2),(3); /* pub # */ CREATE PUBLICATION pub1 FOR TABLE tab_gen_to_gen; /* pub # */ SELECT * FROM tab_gen_to_gen; a | b ---+--- 1 | 2 2 | 3 3 | 4 (3 rows) /* sub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a * 100) STORED); /* sub # */ CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=test_pub' PUBLICATION pub1; /* sub # */ SELECT * from tab_gen_to_gen; a | b ---+---- 1 | 100 2 | 200 3 | 300 (3 rows)
В версиях сервера ниже 18 столбцы с предложением GENERATED
при логической репликации вообще не публикуются.
Однако иногда рекомендуется реплицировать генерируемый столбец в обычный.
Подсказка
Эта функциональность может быть полезна при репликации данных с помощью плагина в базу данных не на основе PostgreSQL, особенно если целевая база данных не поддерживает генерируемые столбцы.
По умолчанию генерируемые столбцы не публикуются, однако у пользователей есть возможность публиковать хранимые генерируемые столбцы так же, как и обычные.
Это можно сделать двумя способами:
Задайте значение
stored
для параметраpublish_generated_columns
командыCREATE PUBLICATION
. Благодаря этому PostgreSQL будет публиковать текущие и будущие хранимые генерируемые столбцы таблиц публикации во время логической репликации.Укажите список столбцов таблицы, чтобы явно задать, какие хранимые генерируемые столбцы нужно опубликовать.
Примечание
При определении того, какие столбцы таблицы нужно публиковать, приоритет будет у списка столбцов. Таким образом результат работы параметра
publish_generated_columns
будет перезаписан.
В следующей таблице обобщается поведение для сценариев, когда в логической репликации участвуют генерируемые столбцы. Результаты приведены для ситуации с выключенной и включённой публикацией генерируемых столбцов.
Таблица 29.2. Результаты репликации
Генерируемые столбцы публикуются? | Столбец таблицы публикующего узла | Столбец таблицы подписчика | Результат |
---|---|---|---|
Нет | Генерируемый | Генерируемый | Столбец таблицы публикующего узла не реплицируется. Используйте значение генерируемого столбца таблицы подписчика. |
Нет | Генерируемый | Обычный | Столбец таблицы публикующего узла не реплицируется. Используйте значение по умолчанию обычного столбца таблицы подписчика. |
Нет | Генерируемый | --Отсутствует-- | Столбец таблицы публикующего узла не реплицируется. Ничего не происходит. |
Да | Генерируемый | Генерируемый | Ошибка. Не поддерживается. |
Да | Генерируемый | Обычный | Значение столбца таблицы публикующего узла реплицируется на столбец таблицы подписчика. |
Да | Генерируемый | --Отсутствует-- | Ошибка. Столбец отсутствует в таблице подписчика. |
Предупреждение
В настоящее время не поддерживаются подписки, связанные с несколькими публикациями, в которых одна таблица опубликована с разными списками столбцов. См. Раздел 29.5.
Такая же ситуация может возникать, если в одной публикации публикуются генерируемые столбы, а в другой публикации с той же подпиской генерируемые столбцы для той же таблицы не публикуются.
Примечание
Если на стороне подписчика используется версия ниже 18, то при первичной синхронизации таблиц генерируемые столбцы не копируются, даже если они определены на публикующем узле.