Перейти к основному содержимому

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

примечание

Эта страница переведена при помощи нейросети GigaChat.

Каждая публикация может дополнительно указывать, какие столбцы каждой таблицы реплицируются подписчикам. Таблица на стороне подписчика должна иметь хотя бы все столбцы, которые опубликованы. Если список столбцов не указан, то все столбцы издателя реплицируются. См. CREATE PUBLICATION для получения подробной информации о синтаксисе.

Выбор столбцов можно основывать на поведенческих или эксплуатационных причинах. Однако не полагайтесь на эту функцию с точки зрения безопасности: злоумышленник-подписчик способен получить данные из столбцов, которые специально не публикуются. Если безопасность является соображением, меры защиты могут быть применены на стороне издателя.

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

Список столбцов может содержать только простые ссылки на столбцы. Порядок столбцов в списке не сохраняется.

Указание списка столбцов при публикации также не поддерживается.

Для партиционированных таблиц параметр публикации 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 для удаления одной из проблемных публикаций и добавления ее снова.

Примеры

Создайте таблицу 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)