CREATE PUBLICATION — 新しいパブリケーションを定義する
CREATE PUBLICATIONname
[ 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操作をサブスクライバーにパブリッシュするかを指定します。
値はカンマで区切られた操作のリストです。
使用できる操作はinsert
、update
、delete
、truncate
です。
デフォルトではすべての動作をパブリッシュするので、このオプションのデフォルト値は'insert, update, delete, truncate'
です。
publish_via_partition_root
(boolean
)このパラメータは、パブリケーションに含まれるパーティションテーブル(またはそのパーティション)での変更を、実際に変更された個々のパーティションではなく、パーティションテーブルの識別とスキーマを使ってパブリッシュするかどうかを決めます。実際に変更された個々のパーティションのものでパブリッシュされるのがデフォルトです。 これを有効にすると、パーティション化されていないテーブルやパーティションの異なる集合からなるパーティションテーブルへ変更を複製できるようになります。
これが有効な場合、パーティションに対して直接実行されたTRUNCATE
操作は複製されません。
FOR TABLE
とFOR ALL TABLES
のどちらも指定されていない場合、パブリケーションは空のテーブルの集合で作られます。
これは後でテーブルを追加したい場合に便利です。
パブリケーションを作るだけでは、レプリケーションは開始されません。 これは単に将来のサブスクライバーのためにグループとフィルタの論理を定義するだけです。
パブリケーションを作成するには、それを実行するユーザは現在のデータベースにCREATE
権限を持っていなければなりません。
(もちろん、スーパーユーザにはこの検査は適用されません。)
パブリケーションにテーブルを追加するには、それを実行するユーザがそのテーブルの所有権を持っていなければなりません。
FOR ALL TABLES
句は、それを実行するユーザがスーパーユーザである必要があります。
UPDATE
またはDELETE
をパブリッシュするパブリケーションに追加されるテーブルにはREPLICA IDENTITY
が定義されていなければなりません。
そうでなければ、それらのテーブルに対して、それらの操作は禁止されることになります。
INSERT ... ON CONFLICT
コマンドに対しては、パブリケーションはコマンドの結果として実際に起こった操作をパブリッシュします。
従って、その結果に応じてINSERT
あるいはUPDATE
のいずれかとしてパブリッシュするか、あるいは何もパブリッシュしないかもしれません。
publish_via_partition_root
をtrue
に設定したルートがパブリッシュされたパブリケーションを使用してパーティションツリーにテーブルを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 PUBLICATION
はPostgreSQLの拡張です。