他のバージョンの文書 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

31.4. 列リスト

各パブリケーションでは、オプションで各テーブルのどの列をサブスクライバーにレプリケーションするかを指定できます。 サブスクライバー側のテーブルには、少なくとも発行されるすべての列が必要です。 列リストが指定されていない場合は、パブリッシャーのすべての列がレプリケーションされます。 構文の詳細はCREATE PUBLICATIONを参照してください。

列の選択は、動作またはパフォーマンスの理由に基づいて行うことができます。 ただし、セキュリティのためにこの機能に依存しないでください。 悪意のあるサブスクライバーが、特に公開されていない列からデータを取得する可能性があります。 セキュリティを考慮する場合は、発行者側で保護を適用できます。

列リストが指定されていない場合、後で追加された列は自動的にレプリケーションされます。 つまり、すべての列に名前を付ける列リストがあることは、列リストがないこととは異なります。

列リストには、単純な列参照のみを含めることができます。 リスト内の列の順序は保持されません。

パブリケーションもパブリッシュする場合の列リストの指定FOR TABLES IN SCHEMAはサポートされていません。

パーティション化テーブルの場合、パブリケーション・パラメータpublish_via_partition_rootによって使用される列リストが決定されます。 publish_via_partition_roottrueの場合、ルートのパーティション化テーブルの列リストが使用されます。 それ以外の場合、publish_via_partition_rootfalse(デフォルト)の場合、各パーティションの列リストが使用されます。

パブリケーションがUPDATEまたはDELETE操作をパブリッシュする場合、どの列リストにもテーブルのレプリカID列が含まれている必要があります(REPLICA IDENTITYを参照)。 パブリケーションがINSERT操作のみをパブリッシュする場合列リストでレプリカID列を省略できます。

列リストは、TRUNCATEコマンドには影響しません。

初期データの同期化時には、公開済の列のみがコピーされます。 ただし、サブスクライバーが15より前のリリースの場合は、テーブルのすべての列が初期データの同期化時にコピーされ、列リストは無視されます。

警告: 複数のパブリケーションからの列リストの統合

現在、同じテーブルが異なる列リストで発行されている複数のパブリケーションで構成されるサブスクリプションはサポートされていません。 CREATE SUBSCRIPTIONではこのようなサブスクリプションの作成はできませんが、サブスクリプションの作成後にパブリケーション側で列リストを追加または変更することで、このような状況になる可能性はあります。

つまり、すでにサブスクライブされているパブリケーションのテーブルの列リストを変更すると、サブスクライバ側でエラーになる可能性があります。

サブスクリプションがこの問題の影響を受ける場合、レプリケーションを再開する唯一の方法は、パブリケーション側の列リストの1つを調整してすべて一致させてから、サブスクリプションを再作成するか、ALTER SUBSCRIPTION ... DROP PUBLICATIONを使用して問題のパブリケーションの1つを削除し、再度追加することです。

31.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を作成し、パブリケーション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)