CREATE PUBLICATION — définir une nouvelle publication
CREATE PUBLICATIONnom
[ FOR ALL TABLES | FORobjet_publication
[, ... ] ] [ WITH (paramètre_publication
[=valeur
] [, ... ] ) ] oùobjet_publication
est parmi ;: TABLE [ ONLY ]nom_table
[ * ] [ (nom_colonne
[, ... ] ) ] [ WHERE (expression
) ] [, ... ] TABLES IN SCHEMA {nom_schéma
| CURRENT_SCHEMA } [, ... ]
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.
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
.
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.
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);
CREATE PUBLICATION
est une extension
PostgreSQL au langage SQL.