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