Each publication can optionally specify which columns of each table are replicated to subscribers. The table on the subscriber side must have at least all the columns that are published. If no column list is specified, then all columns on the publisher are replicated. See <xref linkend="sql-createpublication"/> for details on the syntax. 各パブリケーションでは、オプションで各テーブルのどの列をサブスクライバーにレプリケーションするかを指定できます。 サブスクライバー側のテーブルには、少なくとも発行されるすべての列が必要です。 列リストが指定されていない場合は、パブリッシャーのすべての列がレプリケーションされます。 構文の詳細はCREATE PUBLICATIONを参照してください。
The choice of columns can be based on behavioral or performance reasons. However, do not rely on this feature for security: a malicious subscriber is able to obtain data from columns that are not specifically published. If security is a consideration, protections can be applied at the publisher side. 列の選択は、動作またはパフォーマンスの理由に基づいて行うことができます。 ただし、セキュリティのためにこの機能に依存しないでください。 悪意のあるサブスクライバーが、特に公開されていない列からデータを取得する可能性があります。 セキュリティを考慮する場合は、発行者側で保護を適用できます。
If no column list is specified, any columns added to the table later are automatically replicated. This means that having a column list which names all columns is not the same as having no column list at all. 列リストが指定されていない場合、後でテーブルに追加された列は自動的にレプリケーションされます。 つまり、すべての列に名前を付ける列リストがあることは、列リストがないこととは異なります。
A column list can contain only simple column references. The order of columns in the list is not preserved. 列リストには、単純な列参照のみを含めることができます。 リスト内の列の順序は保持されません。
Specifying a column list when the publication also publishes
<link linkend="sql-createpublication-params-for-tables-in-schema"><literal>FOR TABLES IN SCHEMA</literal></link>
is not supported.
パブリケーションもパブリッシュする場合の列リストの指定FOR TABLES IN SCHEMA
はサポートされていません。
For partitioned tables, the publication parameter
<link linkend="sql-createpublication-params-with-publish-via-partition-root"><literal>publish_via_partition_root</literal></link>
determines which column list is used. If <literal>publish_via_partition_root</literal>
is <literal>true</literal>, the root partitioned table's column list is
used. Otherwise, if <literal>publish_via_partition_root</literal> is
<literal>false</literal> (the default), each partition's column list is used.
パーティション化テーブルの場合、パブリケーションパラメータpublish_via_partition_root
によって使用される列リストが決定されます。
publish_via_partition_root
がtrue
の場合、ルートのパーティション化テーブルの列リストが使用されます。
それ以外の場合、publish_via_partition_root
がfalse
(デフォルト)の場合、各パーティションの列リストが使用されます。
If a publication publishes <command>UPDATE</command> or
<command>DELETE</command> operations, any column list must include the
table's replica identity columns (see
<xref linkend="sql-altertable-replica-identity"/>).
If a publication publishes only <command>INSERT</command> operations, then
the column list may omit replica identity columns.
パブリケーションがUPDATE
またはDELETE
操作をパブリッシュする場合、どの列リストにもテーブルのレプリカアイデンティティ列が含まれている必要があります(REPLICA IDENTITY
を参照)。
パブリケーションがINSERT
操作のみをパブリッシュする場合列リストでレプリカアイデンティティ列を省略できます。
Column lists have no effect for the <literal>TRUNCATE</literal> command.
列リストは、TRUNCATE
コマンドには影響しません。
During initial data synchronization, only the published columns are copied. However, if the subscriber is from a release prior to 15, then all the columns in the table are copied during initial data synchronization, ignoring any column lists. 初期データの同期化時には、公開済の列のみがコピーされます。 ただし、サブスクライバーが15より前のリリースの場合は、テーブルのすべての列が初期データの同期化時にコピーされ、列リストは無視されます。
There's currently no support for subscriptions comprising several publications where the same table has been published with different column lists. <xref linkend="sql-createsubscription"/> disallows creating such subscriptions, but it is still possible to get into that situation by adding or altering column lists on the publication side after a subscription has been created. 現在、同じテーブルが異なる列リストで発行されている複数のパブリケーションで構成されるサブスクリプションはサポートされていません。 CREATE SUBSCRIPTIONではこのようなサブスクリプションの作成はできませんが、サブスクリプションの作成後にパブリケーション側で列リストを追加または変更することで、このような状況になる可能性はあります。
This means changing the column lists of tables on publications that are already subscribed could lead to errors being thrown on the subscriber side. つまり、すでにサブスクライブされているパブリケーションのテーブルの列リストを変更すると、サブスクライバー側でエラーになる可能性があります。
If a subscription is affected by this problem, the only way to resume
replication is to adjust one of the column lists on the publication
side so that they all match; and then either recreate the subscription,
or use <link linkend="sql-altersubscription-params-setadddrop-publication">
<literal>ALTER SUBSCRIPTION ... DROP PUBLICATION</literal></link> to
remove one of the offending publications and add it again.
サブスクリプションがこの問題の影響を受ける場合、レプリケーションを再開する唯一の方法は、パブリケーション側の列リストの1つを調整してすべて一致させてから、サブスクリプションを再作成するか、ALTER SUBSCRIPTION ... DROP PUBLICATION
を使用して問題のパブリケーションの1つを削除し、再度追加することです。
Create a table <literal>t1</literal> to be used in the following example.
次の例で使用するテーブルt1
を作成します。
test_pub=# CREATE TABLE t1(id int, a text, b text, c text, d text, e text, PRIMARY KEY(id)); CREATE TABLE
Create a publication <literal>p1</literal>. A column list is defined for
table <literal>t1</literal> to reduce the number of columns that will be
replicated. Notice that the order of column names in the column list does
not matter.
パブリケーションp1
を作成します。
レプリケーションされる列数を減らすために、テーブルt1
に対して列リストが定義されます。
列リスト内の列名の順序は重要ではないことに注意してください。
test_pub=# CREATE PUBLICATION p1 FOR TABLE t1 (id, b, a, d); CREATE PUBLICATION
<literal>psql</literal> can be used to show the column lists (if defined)
for each 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)
<literal>psql</literal> can be used to show the column lists (if defined)
for each table.
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)
On the subscriber node, create a table <literal>t1</literal> which now
only needs a subset of the columns that were on the publisher table
<literal>t1</literal>, and also create the subscription
<literal>s1</literal> that subscribes to the publication
<literal>p1</literal>.
サブスクライバーノードで、パブリッシャーテーブル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
On the publisher node, insert some rows to table <literal>t1</literal>.
パブリッシャーノードで、テーブル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)
Only data from the column list of publication <literal>p1</literal> is
replicated.
パブリケーション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)