他のバージョンの文書 16 | 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

CREATE PUBLICATION

CREATE PUBLICATION — 新しいパブリケーションを定義する

概要

CREATE PUBLICATION name
    [ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
      | FOR ALL TABLES ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ]

説明

CREATE PUBLICATIONは現在のデータベースに新しいパブリケーションを追加します。 パブリケーションの名前は現在のデータベースに存在するどのパブリケーションの名前とも異なるものでなければなりません。

パブリケーションは本質的にはテーブルの集合で、それらのテーブルのデータの変更が、論理レプリケーションを通じて複製されることが意図されているものです。 論理レプリケーションの設定で、パブリケーションがどのように位置づけられるかの詳細については、31.1を参照してください。

パラメータ

name

新しいパブリケーションの名前です。

FOR TABLE

パブリケーションに追加するテーブルのリストを指定します。 テーブル名の前にONLYが指定されているときは、そのテーブルだけがパブリケーションに追加されます。 ONLYが指定されていないときは、そのテーブルと、そのすべての子テーブル(あれば)が追加されます。 オプションで、テーブル名の後に*を指定して、子テーブルが含まれることを明示的に示すことができます。 しかしながら、これはパーティションテーブルには適用されません。 パーティションテーブルのパーティションは、パブリケーションに含まれると常に暗黙的にみなされますので、パブリケーションに明示的に追加されることは決してありません。

パブリケーションに含めることができるのは、永続的なベーステーブルとパーティションテーブルだけです。 一時テーブル、ログを取らないテーブル、外部テーブル、マテリアライズドビュー、通常のビューはパブリケーションに含めることはできません。

パーティションテーブルがパブリケーションに追加された場合、既存のパーティションと将来のものすべてがパブリケーションに含められたと暗黙的にみなされます。 ですので、パーティションに対して直接実行された操作であっても、その先祖を含むパブリケーション経由でパブリッシュされます。

FOR ALL TABLES

そのパブリケーションでは、将来作成されるテーブルも含め、そのデータベース内の全テーブルについての変更を複製するものとして印をつけます。

WITH ( publication_parameter [= value] [, ... ] )

この句ではパブリケーションのオプションパラメータを指定します。 以下のパラメータがサポートされています。

publish (string)

このパラメータは、新しいパブリケーションがどのDML操作をサブスクライバーにパブリッシュするかを指定します。 値はカンマで区切られた操作のリストです。 使用できる操作はinsertupdatedeletetruncateです。 デフォルトではすべての動作をパブリッシュするので、このオプションのデフォルト値は'insert, update, delete, truncate'です。

publish_via_partition_root (boolean)

このパラメータは、パブリケーションに含まれるパーティションテーブル(またはそのパーティション)での変更を、実際に変更された個々のパーティションではなく、パーティションテーブルの識別とスキーマを使ってパブリッシュするかどうかを決めます。実際に変更された個々のパーティションのものでパブリッシュされるのがデフォルトです。 これを有効にすると、パーティション化されていないテーブルやパーティションの異なる集合からなるパーティションテーブルへ変更を複製できるようになります。

これが有効な場合、パーティションに対して直接実行されたTRUNCATE操作は複製されません。

注釈

FOR TABLEFOR ALL TABLESのどちらも指定されていない場合、パブリケーションは空のテーブルの集合で作られます。 これは後でテーブルを追加したい場合に便利です。

パブリケーションを作るだけでは、レプリケーションは開始されません。 これは単に将来のサブスクライバーのためにグループとフィルタの論理を定義するだけです。

パブリケーションを作成するには、それを実行するユーザは現在のデータベースにCREATE権限を持っていなければなりません。 (もちろん、スーパーユーザにはこの検査は適用されません。)

パブリケーションにテーブルを追加するには、それを実行するユーザがそのテーブルの所有権を持っていなければなりません。 FOR ALL TABLES句は、それを実行するユーザがスーパーユーザである必要があります。

UPDATEまたはDELETEをパブリッシュするパブリケーションに追加されるテーブルにはREPLICA IDENTITYが定義されていなければなりません。 そうでなければ、それらのテーブルに対して、それらの操作は禁止されることになります。

INSERT ... ON CONFLICTコマンドに対しては、パブリケーションはコマンドの結果として実際に起こった操作をパブリッシュします。 従って、その結果に応じてINSERTあるいはUPDATEのいずれかとしてパブリッシュするか、あるいは何もパブリッシュしないかもしれません。

publish_via_partition_roottrueに設定したルートがパブリッシュされたパブリケーションを使用してパーティションツリーにテーブルをATTACHしても、テーブルの既存の内容は複製されません。

COPY ... FROMコマンドはINSERTの操作としてパブリッシュされます。

DDLの操作はパブリッシュされません。

2つのテーブルのすべての変更をパブリッシュするパブリケーションを作成します。

CREATE PUBLICATION mypublication FOR TABLE users, departments;

すべてのテーブルのすべての変更をパブリッシュするパブリケーションを作成します。

CREATE PUBLICATION alltables FOR ALL TABLES;

1つのテーブルのINSERTの操作のみをパブリッシュするパブリケーションを作成します。

CREATE PUBLICATION insert_only FOR TABLE mydata
    WITH (publish = 'insert');

互換性

CREATE PUBLICATIONPostgreSQLの拡張です。

関連項目

ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION