Documentation PostgreSQL 14.22 » Référence » Commandes SQL » CREATE PUBLICATION

Précédent | Niveau supérieur | Suivant
CREATE PROCEDURE | Sommaire | CREATE ROLE

## CREATE PUBLICATION

CREATE PUBLICATION — définir une nouvelle publication

## Synopsis

    CREATE PUBLICATION nom
        [ FOR TABLE [ ONLY ] nom_table [ * ] [, ...]
          | FOR ALL TABLES ]
        [ WITH ( parametre_publication [= valeur] [, ... ] ) ]

## Description

`CREATE PUBLICATION` ajoute une nouvelle publication dans la base courante. Le nom de la publication doit être différent du nom de toutes les autres publications existante au sein de la base courante.

Une publication est essentiellement un groupe de table dont les changement de données sont destinés à être répliqué grâce à la réplication logique. Voir Section 31.1 pour les détails de comment les publications participent à la mise en place de la réplication logique.

## Paramètres

`nom`

  Le nom de la nouvelle publication.

`FOR TABLE`

  Spécifie une liste de tables à ajouter à la publication. Si `ONLY` est spécifié avant le nom de la table, seul cette table est ajoutée à la publication. Si `ONLY` n'est pas spécifié, la table ainsi que toutes les tables descendantes (s'il y en a) est ajoutées. De manière facultative, `*` peut être spécifié après le nom de la table pour indiquer explicitement que les tables descendantes doivent être incluses. Néanmoins, ceci ne s'applique pas à une table partitionnée. Les partitions d'une table sont toujours considérées implicitement comme faisant partie de la publication, donc elles ne sont jamais ajoutées explicitement à la publication.

  Seules les tables persistentes et les tables partitionnées peuvent faire partie d'une publication. Les tables temporaires, tables non journalisées, tables distantes, vues matérialisées et vues standard ne peuvent pas faire partie d'une publication. Pour répliquer une table partitionnée, il faut ajouter chaque partition individuellement à la publication.

  Quand une table partitionnée est ajoutée à une publication, toutes les partitions existantes et futures seront considérées implicitement comme faisant partie de la publication. Donc, même les opérations réalisées directement sur une partition seront publiées via les publications dont fait partie la table partitionnée.

`FOR ALL TABLES`

  Marque la publication comme publication qui réplique les changement pour toutes les tables de la base, en incluant les tables qui seront crées dans le futur.

`WITH ( `parametre_publication` [= `valeur`] [, ... ] )`

  Cette clause spécifique les paramètres facultatifs d'une publication. Les paramètres suivants sont supportés :

  `publish` (`string`)

    Ce paramètre détermine quelles opération DML seront publiées par la nouvelle publication aux souscripteurs. Le contenu est une liste d'opération séparé par des virgules. Les opérations autorisées sont `insert`, `update`, `delete` et `truncate`. Par défaut toutes les actions sont publiées, et donc la valeur par défaut pour cette option est `'insert, update, delete, truncate'`.

  `publish_via_partition_root` (`boolean`)

    Ce paramètre contrôle comment les changements sur une table partitionnée (ou dans ses partitions) sont publiées. Quand configuré à `true`, les changements sont publiés en utilisant l'identité et le schéma de la table racine. Quand configuré à `false` (valeur par défaut), les changements sont publiés en utilisant l'identité et le schéma des partitions individuelles où les changements ont réellement survenu. Activer cette option permet la réplication des modifications dans une table non partitionnée ou dans une table partitionnée dont la structure de la partition diffère de celle du publieur.

    Si ceci est activé, les opérations `TRUNCATE` réalisées directement sur les partitions ne sont pas répliquées.

## Notes

Si ni `FOR TABLE` ni `FOR ALL TABLES` n'est spécifié, alors la publication commence avec un ensemble de tables vide. C'est utile si des tables doivent être ajoutée ultérieurement.

La création d'une publication ne démarre pas la réplication. Cela définit uniquement un regroupement ainsi qu'un filtre logique pour les futurs souscripteurs.

Pour créer une publication, l'utilisateur lançant la commande doit avec le privilège `CREATE` pour la base de données courante. (Bien entendu, les super-utilisateurs coutournent cette vérification.)

Pour ajouter une table à une publication, l'utilisateur lançant la commande doit avoir les droits de propriétaire de la table. La clause `FOR ALL TABLES` nécessite d'être super-utilisateur pour pouvoir l'utiliser.

Les tables ajoutées à une publication qui publie les opérations `UPDATE` et/ou `DELETE` doivent avoir `REPLICA IDENTITY` défini. Autrement ces opérations seront interdites sur ces tables.

Pour une commande `INSERT ... ON CONFLICT`, la publication publiera l'opération qui résulte de la commande. Ainsi, en fonction du résultat, cela pourrait être publiée comme un `INSERT` ou un `UPDATE`, ou cela pourrait ne pas être publié du tout.

`ATTACH`-er une table dans un arbre de partition dont la racine est publiée en utilisant une publication ayant `publish_via_partition_root` configuré to `true` ne résulte pas en la réplication du contenu existant de la table.

Les commandes `COPY ... FROM` sont publiées comme des opérations `INSERT`.

Les opérations DDL ne sont pas publiées.

## Exemples

Créer une publication qui publie tous les changement sur deux tables :

    CREATE PUBLICATION mypublication FOR TABLE users, departments;

Créer une publication qui publie tous les changement sur toutes les tables :

    CREATE PUBLICATION alltables FOR ALL TABLES;

Créer une publication qui ne publie que les opérations d'`INSERT` sur une table :

    CREATE PUBLICATION insert_only FOR TABLE mydata
        WITH (publish = 'insert');

## Compatibilité

`CREATE PUBLICATION` est une extension PostgreSQL au langage SQL.

## Voir aussi

ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION