PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 18 beta 2 » Administration du serveur » Réplication logique » Réplication d'une colonne générée

29.6. Réplication d'une colonne générée #

Typiquement, une table sur un abonné doit être définie de la même façon que sur le publieur, donc si une table sur le publieur a une colonne GENERATED, alors la table sur l'abonné aura une colonne générée correspondante. Dans ce cas, c'est la valeur de la colonne générée sur l'abonné qui est utilisée.

Par exemple, notez ci-dessous que la valeur de la colonne générée sur la table côté abonné vient du calcul de la colonne sur l'abonné.

/* pub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a + 1) STORED);
/* pub # */ INSERT INTO tab_gen_to_gen VALUES (1),(2),(3);
/* pub # */ CREATE PUBLICATION pub1 FOR TABLE tab_gen_to_gen;
/* pub # */ SELECT * FROM tab_gen_to_gen;
 a | b
---+---
 1 | 2
 2 | 3
 3 | 4
(3 rows)

/* sub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a * 100) STORED);
/* sub # */ CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=test_pub' PUBLICATION pub1;
/* sub # */ SELECT * from tab_gen_to_gen;
 a | b
---+----
 1 | 100
 2 | 200
 3 | 300
(3 rows)

En fait, avant la version 18, la réplication logique ne publie jamais les colonnes de type GENERATED.

Mais répliquer une colonne générée vers une colonne standard peut parfois être souhaitable.

Astuce

Cette fonctionnalité pourrait être utile lors de la réplication de données vers une base autre que PostgreSQL via un plugin de sortie, tout spécialement si la base cible ne prend pas en compte les colonnes générées.

Les colonnes générées ne sont pas publiées par défaut mais les utilisateurs peuvent opter pour la publication des colonnes générées stockées comme pour les colonnes standards.

Il existe deux façons de le faire :

  • Configurer le paramètre PUBLICATION publish_generated_columns à stored. Ceci force la réplication logique de PostgreSQL à publier les colonnes générées stockées actuelles et futures des tables de la publication.

  • Spécifier une liste de colonnes d'une table pour nommer explicitement les colonnes générées stockées à publier.

    Note

    Lors de la détermination des colonnes à publier, une liste de colonnes a la priorité, surchargeant les effets du paramètre publish_generated_columns.

La table suivante résume le comportement quand des colonnes générées sont impliquées dans la réplication logique. Les résultats sont affichés quand la publication des colonnes générées est activée et quand elle est désactivée.

Tableau 29.2. Résumé du résultat de réplication

Colonnes générées publiées ?Colonne côté publieurColonne côté abonnéRésultat
NonGENERATEDGENERATEDLa colonne côté publieur n'est pas répliquée. Utilise la valeur de la colonne côté abonné.
NonGENERATEDstandardLa colonne côté publieur n'est pas répliquée. Utilise la valeur par défaut de la colonne côté abonné.
NonGENERATED--manquante--La colonne côté publieur n'est pas répliquée. Rien ne se passe.
OuiGENERATEDGENERATEDERREUR. Non pris en compte.
OuiGENERATEDstandardLa colonne côté publieur est répliquée sur la colonne côté abonné.
OuiGENERATED--manquante--ERREUR. La colonne est rapportée comme manquant côté abonné.

Avertissement

Il n'y a actuellement pas de prise en compte des souscriptions comprenant plusieurs publications où la même table est publiée avec des listes de colonnes différentes. Voir Section 29.5.

Cette même situation peut survenir si une publication a publié des colonnes générées alors qu'une autre publication dans le même abonnement n'a pas publiée les colonnes générées pour la même table.

Note

Si l'abonné est d'une version antérieure à la 18, la synchronisation initiale de la table ne copiera pas les colonnes générées même si elles ont été définies dans le publieur.