29.4. Списки столбцов#

29.4. Списки столбцов

29.4. Списки столбцов

Каждая публикация может опционально указывать, какие столбцы каждой таблицы реплицируются на подписчиках. Таблица на стороне подписчика должна иметь как минимум все столбцы, которые публикуются. Если не указан список столбцов, то реплицируются все столбцы на издателе. См. 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.

Во время начальной синхронизации данных копируются только опубликованные столбцы. Однако, если подписчик является версией ранее 15, то при начальной синхронизации данных копируются все столбцы в таблице, игнорируя любые списки столбцов.

Предупреждение: Комбинирование списков столбцов из нескольких публикаций

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

Это означает, что изменение списков столбцов таблиц в уже подписанных публикациях может привести к возникновению ошибок на стороне подписчика.

Если подписка затронута этой проблемой, единственный способ возобновить репликацию - это настроить один из списков столбцов на стороне публикации так, чтобы они все совпадали; а затем либо пересоздать подписку, либо использовать ALTER SUBSCRIPTION ... DROP PUBLICATION для удаления одной из проблемных публикаций и их повторного добавления.

29.4.1. Примеры

Создайте таблицу 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+
                               Publication p1
  Owner   | All tables | Inserts | Updates | Deletes | Truncates | Via root
----------+------------+---------+---------+---------+-----------+----------
 postgres | f          | t       | t       | t       | t         | f
Tables:
    "public.t1" (id, a, b, d)

psql может использоваться для отображения списков столбцов (если они определены) для каждой таблицы.

test_pub=# \d t1
                 Table "public.t1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           | not null |
 a      | text    |           |          |
 b      | text    |           |          |
 c      | text    |           |          |
 d      | text    |           |          |
 e      | text    |           |          |
Indexes:
    "t1_pkey" PRIMARY KEY, btree (id)
Publications:
    "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 реплицируются.

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)