В каждой публикации можно дополнительно указать, какие именно столбцы каждой таблицы будут реплицироваться подписчикам. Таблица на стороне подписчика должна содержать как минимум все те столбцы, которые включены в публикацию. Если список столбцов не указан, то реплицируются все столбцы на стороне издателя. Подробнее см. CREATE PUBLICATION для получения информации о синтаксисе.
Выбор столбцов может быть продиктован логикой работы приложения или соображениями производительности. Однако не следует полагаться на данную функцию в целях безопасности: злоумышленник, выступающий в роли подписчика, может получить данные из столбцов, которые не были явно опубликованы. Если безопасность имеет значение, соответствующие механизмы защиты должны быть настроены на стороне издателя.
Если список столбцов не задан, любые столбцы, добавленные в таблицу в дальнейшем, будут реплицироваться автоматически. Таким образом, наличие списка столбцов, в котором перечислены все существующие столбцы, не идентично отсутствию списка столбцов как такового.
Список столбцов может содержать только простые ссылки на столбцы. Порядок столбцов в списке не сохраняется.
Указание списка столбцов в случаях, когда публикация также публикует
FOR TABLES IN SCHEMA
не поддерживается.
Для секционированных таблиц параметр публикации
publish_via_partition_root
определяет, какой список столбцов будет использоваться. Если publish_via_partition_root
имеет значение true, используется список столбцов корневой секционированной таблицы. В противном случае, если publish_via_partition_root имеет значение
false (по умолчанию), используется список столбцов каждой секции.
Если публикация публикует UPDATE или
DELETE операции, любой список столбцов должен включать
столбцы идентификатора реплики таблицы (см.
REPLICA IDENTITY).
Если публикация публикует только INSERT операции, то
в списке столбцов можно не указывать столбцы идентификатора реплики.
Списки столбцов не влияют на команду TRUNCATE command.
При начальной синхронизации данных копируются только опубликованные столбцы. Однако если подписчик относится к версии ниже 15, то в ходе начальной синхронизации данных копируются все столбцы таблицы, а списки столбцов игнорируются.
В настоящее время не поддерживаются подписки, включающие несколько публикаций, в которых одна и та же таблица опубликована с различными списками столбцов. CREATE SUBSCRIPTION запрещает создание таких подписок, однако возникновение этой ситуации все еще возможно путем добавления или изменения списков столбцов на стороне публикации после создания подписки.
Это означает, что изменение списков столбцов для таблиц в публикациях, на которые уже оформлена подписка, может привести к возникновению ошибок на стороне подписчика.
Если подписка затронута данной проблемой, единственным способом возобновить репликацию является корректировка списков столбцов на стороне публикации таким образом, чтобы все они совпадали; после чего необходимо либо заново создать подписку, либо использовать
ALTER SUBSCRIPTION ... DROP PUBLICATION чтобы удалить одну из конфликтующих публикаций и добавить её повторно.
Создание таблицы t1 для использования в следующем примере.
test_pub=# CREATE TABLE t1(id int, a text, b text, c text, d text, e text, PRIMARY KEY(id)); CREATE TABLE
Создайте публикацию p1. Для таблицы определен список столбцов t1 с целью сокращения количества реплицируемых столбцов. Обратите внимание, что порядок имен в списке столбцов не имеет значения.
test_pub=# CREATE PUBLICATION p1 FOR TABLE t1 (id, b, a, d); CREATE PUBLICATION
psql может применяться для вывода списков столбцов (если они определены) для каждой публикации.
test_pub=# \dRp+
Публикация p1
Владелец | Все таблицы | Вставки | обновления | удаление | команды TRUNCATE | через корневую таблицу
----------+------------+---------+---------+---------+-----------+----------
postgres | f | t | t | t | t | f
Таблицы:
"public.t1" (id, a, b, d)
psql может применяться для вывода списков столбцов (если они определены) для каждой таблицы.
test_pub=# \d t1
Таблица "public.t1"
Столбец | Тип | Правило сортировки | Допускающий значение NULL | По умолчанию
--------+---------+-----------+----------+---------
id | integer | | not null |
a | text | | |
b | text | | |
c | text | | |
d | text | | |
e | text | | |
Индексы:
"t1_pkey" PRIMARY KEY, btree (id)
Публикации:
"p1" (id, a, b, d)
На узле-подписчике создается таблица t1 которой теперь требуется только подмножество столбцов, присутствовавших в таблице издателя
t1, а также создается подписка
s1 , обеспечивающая подписку на публикацию
p1.
test_sub=# CREATE TABLE t1(id int, b text, a text, d text, PRIMARY KEY(id)); CREATE TABLE test_sub=# CREATE SUBSCRIPTION s1 test_sub-# CONNECTION 'host=localhost dbname=test_pub application_name=s1' test_sub-# PUBLICATION p1; CREATE SUBSCRIPTION
На узле-издателе в таблицу вставляется несколько строк t1.
test_pub=# INSERT INTO t1 VALUES(1, 'a-1', 'b-1', 'c-1', 'd-1', 'e-1'); INSERT 0 1 test_pub=# INSERT INTO t1 VALUES(2, 'a-2', 'b-2', 'c-2', 'd-2', 'e-2'); INSERT 0 1 test_pub=# INSERT INTO t1 VALUES(3, 'a-3', 'b-3', 'c-3', 'd-3', 'e-3'); INSERT 0 1 test_pub=# SELECT * FROM t1 ORDER BY id; id | a | b | c | d | e ----+-----+-----+-----+-----+----- 1 | a-1 | b-1 | c-1 | d-1 | e-1 2 | a-2 | b-2 | c-2 | d-2 | e-2 3 | a-3 | b-3 | c-3 | d-3 | e-3 (3 rows)
Репликации подлежат только данные из списка столбцов публикации p1 is
replicated.
test_sub=# SELECT * FROM t1 ORDER BY id; id | b | a | d ----+-----+-----+----- 1 | b-1 | a-1 | d-1 2 | b-2 | a-2 | d-2 3 | b-3 | a-3 | d-3 (3 rows)