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.
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.
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é publieur | Colonne côté abonné | Résultat |
---|---|---|---|
Non | GENERATED | GENERATED | La colonne côté publieur n'est pas répliquée. Utilise la valeur de la colonne côté abonné. |
Non | GENERATED | standard | La colonne côté publieur n'est pas répliquée. Utilise la valeur par défaut de la colonne côté abonné. |
Non | GENERATED | --manquante-- | La colonne côté publieur n'est pas répliquée. Rien ne se passe. |
Oui | GENERATED | GENERATED | ERREUR. Non pris en compte. |
Oui | GENERATED | standard | La colonne côté publieur est répliquée sur la colonne côté abonné. |
Oui | GENERATED | --manquante-- | ERREUR. La colonne est rapportée comme manquant côté abonné. |
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.
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.