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'です。
FOR TABLEとFOR ALL TABLESのどちらも指定されていない場合、パブリケーションは空のテーブルの集合で作られます。
これは後でテーブルを追加したい場合に便利です。
パブリケーションを作るだけでは、レプリケーションは開始されません。 これは単に将来のサブスクライバのためにグループとフィルタの論理を定義するだけです。
パブリケーションを作成するには、それを実行するユーザは現在のデータベースにCREATE権限を持っていなければなりません。
(もちろん、スーパーユーザにはこの検査は適用されません。)
パブリケーションにテーブルを追加するには、それを実行するユーザがそのテーブルの所有権を持っていなければなりません。
FOR ALL TABLES句は、それを実行するユーザがスーパーユーザである必要があります。
UPDATEまたはDELETEをパブリッシュするパブリケーションに追加されるテーブルにはREPLICA IDENTITYが定義されていなければなりません。
そうでなければ、それらのテーブルに対して、それらの操作は禁止されることになります。
INSERT ... ON CONFLICTコマンドに対しては、パブリケーションはコマンドの結果として実際に起こった操作をパブリッシュします。
従って、その結果に応じてINSERTあるいはUPDATEのいずれかとしてパブリッシュするか、あるいは何もパブリッシュしないかもしれません。
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の拡張です。