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)