CREATE PUBLICATION — 新しいパブリケーションを定義する
CREATE PUBLICATIONname
[ FOR ALL TABLES | FORpublication_object
[, ... ] ] [ WITH (publication_parameter
[=value
] [, ... ] ) ] ここでpublication_object
は以下のいずれかです。 TABLE [ ONLY ]table_name
[ * ] [ (column_name
[, ... ] ) ] [ WHERE (expression
) ] [, ... ] TABLES IN SCHEMA {schema_name
| CURRENT_SCHEMA } [, ... ]
CREATE PUBLICATION
は現在のデータベースに新しいパブリケーションを追加します。
パブリケーションの名前は現在のデータベースに存在するどのパブリケーションの名前とも異なるものでなければなりません。
パブリケーションは本質的にはテーブルの集合で、それらのテーブルのデータの変更が、論理レプリケーションを通じて複製されることが意図されているものです。 論理レプリケーションの設定で、パブリケーションがどのように位置づけられるかの詳細については、31.1を参照してください。
name
#新しいパブリケーションの名前です。
FOR TABLE
#
パブリケーションに追加するテーブルのリストを指定します。
テーブル名の前にONLY
が指定されているときは、そのテーブルだけがパブリケーションに追加されます。
ONLY
が指定されていないときは、そのテーブルと、そのすべての子テーブル(あれば)が追加されます。
オプションで、テーブル名の後に*
を指定して、子テーブルが含まれることを明示的に示すことができます。
しかしながら、これはパーティションテーブルには適用されません。
パーティションテーブルのパーティションは、パブリケーションに含まれると常に暗黙的にみなされますので、パブリケーションに明示的に追加されることは決してありません。
オプションのWHERE
句を指定すると、行フィルタ式が定義されます。
expression
が偽またはNULLと評価される行はパブリッシュされません。
式を括弧で囲む必要があることに注意してください。
TRUNCATE
コマンドには影響しません。
列リストを指定すると、指定した列のみが複製されます。
列リストが指定されていない場合は、後で追加される列も含めて、テーブルのすべての列がこのパブリケーションを介して複製されます。
TRUNCATE
コマンドには影響しません。
列リストの詳細は31.4を参照してください。
パブリケーションに含めることができるのは、永続的なベーステーブルとパーティションテーブルだけです。 一時テーブル、ログを取らないテーブル、外部テーブル、マテリアライズドビュー、通常のビューはパブリケーションに含めることはできません。
パブリケーションがFOR TABLES IN SCHEMA
もパブリッシュする場合に列リストを指定することはサポートされていません。
パーティションテーブルがパブリケーションに追加された場合、既存のパーティションと将来のものすべてがパブリケーションに含められたと暗黙的にみなされます。 ですので、パーティションに対して直接実行された操作であっても、その先祖を含むパブリケーション経由でパブリッシュされます。
FOR ALL TABLES
#そのパブリケーションでは、将来作成されるテーブルも含め、そのデータベース内の全テーブルについての変更を複製するものとして印をつけます。
FOR TABLES IN SCHEMA
#そのパブリケーションでは、将来作成されるテーブルも含め、指定されたスキーマのリスト内の全テーブルについての変更を複製するものとして印をつけます。
パブリケーションが列リストを持つテーブルもパブリッシュする場合のスキーマの指定はサポートされていません。
パブリケーションに含めることができるのは、スキーマ内に存在する永続的なベーステーブルとパーティションテーブルだけです。 一時テーブル、ログを取らないテーブル、外部テーブル、マテリアライズドビュー、通常のビューはパブリケーションに含めることはできません。
パーティションテーブルがスキーマレベルのパブリケーションでパブリッシュされた場合、パブリケーションスキーマからのものかどうかに関わらず、既存のパーティションと将来のものすべてがパブリケーションに含められたと暗黙的にみなされます。 ですので、パーティションに対して直接実行された操作であっても、その先祖を含むパブリケーション経由でパブリッシュされます。
WITH ( publication_parameter
[= value
] [, ... ] )
#この句ではパブリケーションのオプションパラメータを指定します。 以下のパラメータがサポートされています。
publish
(string
) #
このパラメータは、新しいパブリケーションがどのDML操作をサブスクライバーにパブリッシュするかを指定します。
値はカンマで区切られた操作のリストです。
使用できる操作はinsert
、update
、delete
、truncate
です。
デフォルトではすべての動作をパブリッシュするので、このオプションのデフォルト値は'insert, update, delete, truncate'
です。
このパラメータはDML操作にのみ影響します。 特に、論理レプリケーションの初期データ同期化(31.7.1を参照)では、既存のテーブルデータをコピーするときにこのパラメータは考慮されません。
publish_via_partition_root
(boolean
) #このパラメータは、パブリケーションに含まれるパーティションテーブル(またはそのパーティション)での変更を、実際に変更された個々のパーティションではなく、パーティションテーブルの識別とスキーマを使ってパブリッシュするかどうかを決めます。実際に変更された個々のパーティションのものでパブリッシュされるのがデフォルトです。 これを有効にすると、パーティション化されていないテーブルやパーティションの異なる集合からなるパーティションテーブルへ変更を複製できるようになります。
1つのサブスクリプションが複数のパブリケーションを組み合わせている場合があります。
publish_via_partition_root = true
を設定しサブスクライブされたパブリケーションがパーティションテーブルをパブリッシュする場合、このパーティションテーブル(またはそのパーティション)の変更は、個々のパーティションのものではなく、このパーティションテーブルのIDとスキーマを使用してパブリッシュされます。
このパラメータは、パーティション用の行フィルタと列リストの選択方法にも影響します。 詳細は以下を参照してください。
これが有効な場合、パーティションに対して直接実行されたTRUNCATE
操作は複製されません。
boolean
型のパラメータを指定する場合、=
value
の部分を省略できます。これはTRUE
を指定するのと同じです。
FOR TABLE
、FOR ALL TABLES
、FOR TABLES IN SCHEMA
のいずれも指定されていない場合、パブリケーションは空のテーブルの集合で作られます。
これは後でテーブルを追加したい場合に便利です。
パブリケーションを作るだけでは、レプリケーションは開始されません。 これは単に将来のサブスクライバーのためにグループとフィルタの論理を定義するだけです。
パブリケーションを作成するには、それを実行するユーザは現在のデータベースにCREATE
権限を持っていなければなりません。
(もちろん、スーパーユーザにはこの検査は適用されません。)
パブリケーションにテーブルを追加するには、それを実行するユーザがそのテーブルの所有権を持っていなければなりません。
FOR ALL TABLES
句やFOR TABLES IN SCHEMA
句は、それを実行するユーザがスーパーユーザである必要があります。
UPDATE
またはDELETE
をパブリッシュするパブリケーションに追加されるテーブルにはREPLICA IDENTITY
が定義されていなければなりません。
そうでなければ、それらのテーブルに対して、それらの操作は禁止されることになります。
UPDATE
またはDELETE
操作をパブリッシュするには、すべての列リストにREPLICA IDENTITY
列が含まれている必要があります。
パブリケーションがINSERT
操作のみをパブリッシュする場合は、列リストの制限はありません。
行フィルタ式(すなわち、WHERE
句)には、UPDATE
およびDELETE
操作をパブリッシュするために、REPLICA IDENTITY
でカバーされる列のみを含めることが必要です。
INSERT
操作のパブリッシュでは、WHERE
式で任意の列を使用できます。
行フィルタでは、ユーザー定義関数、ユーザー定義演算子、ユーザー定義型、ユーザー定義照合順序、不変でない組み込み関数、またはシステム列への参照を持たない単純な式を使用できます。
FOR TABLES IN SCHEMA
が指定され、そのテーブルが参照されたスキーマに属している場合、テーブルの行フィルタは冗長になります。
パブリッシュされたパーティションテーブルの場合、各パーティションの行フィルタは、パブリケーションパラメータpublish_via_partition_root
が真の場合にはパブリッシュされたパーティションテーブルから、偽の場合(デフォルト)にはパーティション自体から取得されます。
行フィルタの詳細は31.3を参照してください。
同様に、パブリッシュされたパーティションテーブルの場合、各パーティションの列リストは、パブリケーションパラメータpublish_via_partition_root
が真の場合にはパブリッシュされたパーティションテーブルから、偽の場合にはパーティション自体から取得されます。
INSERT ... ON CONFLICT
コマンドに対しては、パブリケーションはコマンドの結果として起こった操作をパブリッシュします。
その結果に応じてINSERT
あるいはUPDATE
のいずれかとしてパブリッシュするか、あるいは何もパブリッシュしないかもしれません。
MERGE
コマンドに対しては、パブリケーションは挿入、更新、または削除された行ごとにINSERT
、UPDATE
、またはDELETE
をパブリッシュします。
publish_via_partition_root
をtrue
に設定したルートがパブリッシュされたパブリケーションを使用してパーティションツリーにテーブルをATTACH
しても、テーブルの既存の内容は複製されません。
COPY ... FROM
コマンドはINSERT
の操作としてパブリッシュされます。
DDLの操作はパブリッシュされません。
WHERE
句の式は、レプリケーション接続に使用されるロールで実行されます。
2つのテーブルのすべての変更をパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION mypublication FOR TABLE users, departments;
活発な部署(active departments)からのすべての変更をパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);
すべてのテーブルのすべての変更をパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION alltables FOR ALL TABLES;
1つのテーブルのINSERT
の操作のみをパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');
テーブルusers
、departments
のすべての変更、およびスキーマproduction
に存在するすべてのテーブルのすべての変更をパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
スキーマmarketing
およびsales
に存在するすべてのテーブルに対するすべての変更をパブリッシュするパブリケーションを作成します。
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
テーブルusers
のすべての変更をパブリッシュするものの、列user_id
とfirstname
のみを複製するパブリケーションを作成します。
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
CREATE PUBLICATION
はPostgreSQLの拡張です。