各パブリケーションでは、オプションで各テーブルのどの列をサブスクライバーにレプリケーションするかを指定できます。 サブスクライバー側のテーブルには、少なくとも発行されるすべての列が必要です。 列リストが指定されていない場合は、パブリッシャーのすべての列がレプリケーションされます。 構文の詳細は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ではこのようなサブスクリプションの作成はできませんが、サブスクリプションの作成後にパブリケーション側で列リストを追加または変更することで、このような状況になる可能性はあります。
つまり、すでにサブスクライブされているパブリケーションのテーブルの列リストを変更すると、サブスクライバ側でエラーになる可能性があります。
サブスクリプションがこの問題の影響を受ける場合、レプリケーションを再開する唯一の方法は、パブリケーション側の列リストの1つを調整してすべて一致させてから、サブスクリプションを再作成するか、ALTER SUBSCRIPTION ... DROP PUBLICATION
を使用して問題のパブリケーションの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
を作成し、パブリケーションp1
をサブスクライブするサブスクリプションs1
も作成します。
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)