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の拡張です。