PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.1 » Référence » Commandes SQL » CREATE PUBLICATION

CREATE PUBLICATION

CREATE PUBLICATION — définir une nouvelle publication

Synopsis

CREATE PUBLICATION nom
    [ FOR ALL TABLES
      | FOR objet_publication [, ... ] ]
    [ WITH ( paramètre_publication [= valeur] [, ... ] ) ]

objet_publication est parmi ;:

    TABLE [ ONLY ] nom_table [ * ] [ ( nom_colonne [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
    TABLES IN SCHEMA { nom_schéma | CURRENT_SCHEMA } [, ... ]
  

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 29.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.

Si la clause WHERE optionnelle est indiquée, elle définit une expression de filtre de lignes. Les lignes pour lesquelles l'expression vaut false ou NULL ne seront pas publiées. Notez que les parenthèses sont requises autour de l'expression. Cette clause n'a pas d'effet sur les commandes TRUNCATE.

Quand une liste de colonnes est indiquée, seules les colonnes nommées sont répliquées. Si aucune liste de colonnes n'est indiquée, toutes les colonnes de la table sont répliquées au travers de cette publication, en incluant toutes les colonnes ajoutées après coup. Cela n'a pas d'effet sur TRUNCATE. Voir Section 29.5 pour plus de détails sur les listes de colonnes.

Seules les tables persistantes 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.

Indiquer une liste de colonnes quand la publication publie aussi FOR TABLES IN SCHEMA n'est pas autorisé.

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.

FOR TABLES IN SCHEMA #

Marque la publication comme répliquant les changements de toutes les tables de la liste de schémas indiquée, incluant les tables créées plus tard.

Indiquer un schéma quand la publication publie aussi une table avec une liste de colonnes n'est pas supporté.

Seules les tables persistantes et les tables partitionnées présentes dans le schéma seront inclus dans la publication. Les tables temporaires, les tables non journalisées, les tables distantes, les vues matérialisées et les vues standards du schéma ne feront pas partie de la publication.

Quand une table partitionnée est publiée via la publication au niveau schéma, toutes les partitions existantes et futures sont implicitement considérées comme faisant partie de la publication, qu'elles soient dans le schéma de publication ou pas. Donc, même les opérations réalisées directement sur une partition sont aussi publiées via les publications auxquelles ont fait partie ses ancêtres.

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

Cette clause spécifique les paramètres facultatifs d'une publication. Les paramètres suivants sont accepté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'.

Ce paramètre affecte seulement les opérations DML. En particulier, la synchronisation initiale des données (voir Section 29.8.1) pour la réplication logique ne prend pas en compte ce paramètre lors de la copie de données existantes de la table.

publish_via_partition_root (boolean) #

Ce paramètre détermine si les modifications dans une table partitionnée (ou dans ses partitions) contenue dans la publication seront publiées en utilisant l'identité et le schéma de la table partitionnée plutôt que celle des partitions individuelles réellement modifiées ; ce dernier est le comportement par défaut. Activer ce paramètre permet à des changements d'être répliqués dans une table non partitionnée ou dans une table partitionnée différemment.

Il peut exister un cas où une souscription combine plusieurs publications. Si une table partitionnée est publiée par une publication souscrite pour laquelle publish_via_partition_root = true, tout changement sur cette table partitionnée (ou ses partitions) sera publié en utilisant l'identité et le schéma de la table partitionnée plutôt que celles des partitions individuelles.

Ce paramètre affecte aussi comment les filtres de lignes et les listes de colonnes sont choisis pour les partitions ; voir ci-dessous pour les détails.

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

Lors de la spécification d'un paramètre de type boolean, la partie = valeur peut être omise, ce qui est équivalent à indiquer TRUE.

Notes

Si les clauses FOR TABLE, FOR ALL TABLES ou FOR TABLES IN SCHEMA ne sont pas passées, alors la publication commence avec un ensemble vide de tables. C'est utile si les tables ou schémas sont à ajouter 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 droit CREATE pour la base de données courante. (Bien entendu, les superutilisateurs contournent 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. Les clauses FOR ALL TABLES et FOR TABLES IN SCHEMA nécessitent d'être superutilisateur pour pouvoir les 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.

Toute liste de colonnes doit inclure les colonnes REPLICA IDENTITY dans l'ordre pour la publication d'opérations UPDATE ou DELETE. Il n'y a pas des restrictions de listes de colonnes si la publication publie seulement des opérations INSERT.

Une expression de filtre par lignes (par exemple la clause WHERE) doit uniquement contenir les colonnes couvertes par REPLICA IDENTITY, pour que les opérations UPDATE et DELETE soient publiées. Pour la publication des opérations INSERT, toute colonne peut être utilisée dans l'expression WHERE. Le filtre de lignes autorise des expressions simples qui n'ont pas de fonctions définies par l'utilisateur, d'opérateurs définis par l'utilisateur, de types définis par l'utilisateur, de collations définis par l'utilisateur, de fonctions internes non immutables, ou de références à des colonnes systèmes.

Le filtre de lignes sur une table devient redondant si FOR TABLES IN SCHEMA est indiqué et que la table appartient au schéma référencé.

Pour les tables partitionnées publiées, le filtre de lignes pour que partition est pris de la table partitionnée publiée si le paramètre de publication publish_via_partition_root vaut true ou à partir de la partition elle-même s'il vaut false (valeur par défaut). Voir Section 29.4 pour les détails sur les filtres de lignes. De façon similaire, pour les tables partitionnées publiées, la liste de colonnes pour chaque partition est prise de la table partitionnée publiée si le paramètre de publication publish_via_partition_root vaut true, ou à partir de la partition elle-même si le paramètre vaut false.

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.

Pour une commande MERGE, la publication publiera un INSERT, UPDATE ou DELETE pour chaque ligne insérée, mise à jour ou supprimée.

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.

L'expression de la clause WHERE est exécutée avec le rôle utilisé pour la connexion de réplication.

Exemples

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

CREATE PUBLICATION mypublication FOR TABLE users, departments;
   

Créer une publication qui publie tous les changements des départements actifs :

CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);

Créer une publication qui publie tous les changements 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');

Créer une publication qui publie tous les changements des tables users, departments et tous les changements pour toutes les tables présentes dans le schéma production :

CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;

Créer une publication qui publie tous les changements pour toutes les tables présentes dans les schémas marketing et sales :

CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;

Créer une publication qui publie tous les changements pour la table users, mais réplique uniquement les colonnes user_id et firstname :

CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
   

Compatibilité

CREATE PUBLICATION est une extension PostgreSQL au langage SQL.