CREATE PUBLICATION — define una nueva publicación
CREATE PUBLICATIONnombre[ FOR ALL TABLES | FORobjeto_publicación[, ... ] ] [ WITH (parámetro_publicación[=valor] [, ... ] ) ] dondeobjeto_publicaciónes uno de: TABLEtabla_y_columnas[, ... ] TABLES IN SCHEMA {nombre_esquema| CURRENT_SCHEMA } [, ... ] ytabla_y_columnases: [ ONLY ]nombre_tabla[ * ] [ (nombre_columna[, ... ] ) ] [ WHERE (expresión) ]
CREATE PUBLICATION agrega una nueva publicación
en la base de datos actual. El nombre de la publicación debe ser distinto del
nombre de cualquier publicación existente en la base de datos actual.
Una publicación es esencialmente un grupo de tablas cuyos cambios de datos están destinados a ser replicados a través de replicación lógica. Consulta la Section 29.1 para obtener detalles sobre cómo encajan las publicaciones en la configuración de replicación lógica.
nombre #El nombre de la nueva publicación.
FOR TABLE #
Especifica una lista de tablas a agregar a la publicación. Si se especifica
ONLY antes del nombre de la tabla, solo esa tabla se agrega
a la publicación. Si no se especifica ONLY, se agregan la tabla
y todas sus tablas descendientes (si las hay). Opcionalmente, se puede especificar
* después del nombre de la tabla para indicar explícitamente que
se incluyen las tablas descendientes. Sin embargo, esto no se aplica a una tabla
particionada. Las particiones de una tabla particionada siempre se consideran
implícitamente parte de la publicación, por lo que nunca se agregan explícitamente
a la publicación.
Si se especifica la cláusula opcional WHERE, esta define una
expresión de filtro de filas. Las filas para las cuales la
expresión se evalúe como false o null
no serán publicadas. Ten en cuenta que se requieren paréntesis alrededor de la
expresión. No tiene efecto sobre los comandos TRUNCATE.
Cuando se especifica una lista de columnas, solo se replican las columnas nombradas.
La lista de columnas también puede contener columnas generadas almacenadas (stored generated columns).
Si se omite la lista de columnas, la publicación replicará por defecto todas las
columnas no generadas (incluyendo las que se agreguen en el futuro). Las columnas generadas
almacenadas también pueden replicarse si publish_generated_columns
se establece en stored. Especificar una lista de columnas no tiene
efecto sobre los comandos TRUNCATE. Consulta la
Section 29.5 para obtener detalles sobre las listas
de columnas.
Solo las tablas base persistentes y las tablas particionadas pueden ser parte de una publicación. Las tablas temporales, las tablas no registradas (unlogged), las tablas foráneas, las vistas materializadas y las vistas normales no pueden ser parte de una publicación.
No se admite especificar una lista de columnas cuando la publicación también publica
FOR TABLES IN SCHEMA.
Cuando una tabla particionada se agrega a una publicación, todas sus particiones existentes y futuras se consideran implícitamente parte de la publicación. Por lo tanto, incluso las operaciones que se realizan directamente sobre una partición también se publican a través de las publicaciones de las cuales sus ancestros forman parte.
FOR ALL TABLES #Marca la publicación como una que replica los cambios de todas las tablas de la base de datos, incluyendo las tablas que se creen en el futuro.
FOR TABLES IN SCHEMA #Marca la publicación como una que replica los cambios de todas las tablas en la lista especificada de esquemas, incluyendo las tablas que se creen en el futuro.
No se admite especificar un esquema cuando la publicación también publica una tabla con una lista de columnas.
Solo las tablas base persistentes y las tablas particionadas presentes en el esquema se incluirán como parte de la publicación. Las tablas temporales, las tablas no registradas (unlogged), las tablas foráneas, las vistas materializadas y las vistas normales del esquema no formarán parte de la publicación.
Cuando una tabla particionada se publica a través de una publicación a nivel de esquema, todas sus particiones existentes y futuras se consideran implícitamente parte de la publicación, independientemente de si pertenecen al esquema de la publicación o no. Por lo tanto, incluso las operaciones que se realizan directamente sobre una partición también se publican a través de las publicaciones de las cuales sus ancestros forman parte.
WITH ( parámetro_publicación [= valor] [, ... ] ) #Esta cláusula especifica parámetros opcionales para una publicación. Se admiten los siguientes parámetros:
publish (string) #
Este parámetro determina qué operaciones DML serán publicadas por la nueva
publicación a los suscriptores. El valor es una lista de operaciones separadas por
comas. Las operaciones permitidas son insert, update,
delete y truncate. Por defecto se publican todas
las acciones, por lo que el valor predeterminado para esta opción es
'insert, update, delete, truncate'.
Este parámetro solo afecta a las operaciones DML. En particular, la sincronización inicial de datos (consulta la Section 29.9.1) para la replicación lógica no tiene en cuenta este parámetro al copiar los datos existentes de las tablas.
publish_generated_columns (enum) #
Especifica si se deben replicar las columnas generadas presentes en las tablas
asociadas con la publicación. Los valores posibles son none y
stored.
El valor predeterminado es none, lo que significa que las columnas
generadas presentes en las tablas asociadas con la publicación no se replicarán.
Si se establece en stored, se replicarán las columnas generadas
almacenadas presentes en las tablas asociadas con la publicación.
Si el suscriptor es de una versión anterior a la 18, la sincronización inicial de la
tabla no copiará las columnas generadas incluso si el parámetro
publish_generated_columns está establecido en stored
en el publicador.
Consulta la Section 29.6 para obtener más detalles sobre la replicación lógica de columnas generadas.
publish_via_partition_root (boolean) #
Este parámetro controla cómo se publican los cambios en una tabla particionada (o en cualquiera
de sus particiones). Cuando se establece en true, los cambios se publican
utilizando la identidad y el esquema de la tabla particionada raíz. Cuando se establece en
false (el valor predeterminado), los cambios se publican utilizando la identidad
y el esquema de las particiones individuales donde realmente ocurrieron los cambios. Habilitar
esta opción permite que los cambios se repliquen en una tabla no particionada o en una tabla
particionada cuya estructura de partición difiera de la del publicador.
Puede darse el caso de que una suscripción combine múltiples publicaciones. Si una tabla
particionada es publicada por cualquiera de las publicaciones suscritas que establezcan
publish_via_partition_root = true, los cambios en esta tabla particionada
(o en sus particiones) se publicarán utilizando la identidad y el esquema de esta tabla
particionada en lugar del de las particiones individuales.
Este parámetro también afecta a cómo se eligen los filtros de filas y las listas de columnas para las particiones; consulta más abajo para ver los detalles.
Si esto está habilitado, las operaciones TRUNCATE realizadas directamente
en las particiones no se replican.
Al especificar un parámetro de tipo boolean, se puede omitir la parte
= valor, lo cual es equivalente a
especificar TRUE.
Si no se especifican FOR TABLE, FOR ALL TABLES o
FOR TABLES IN SCHEMA, la publicación comienza con un conjunto vacío de tablas.
Esto es útil si se desean agregar tablas o esquemas más adelante.
La creación de una publicación no inicia la replicación. Solo define una lógica de agrupación y filtrado para futuros suscriptores.
Para crear una publicación, el usuario que la invoca debe tener el privilegio
CREATE para la base de datos actual. (Por supuesto, los superusuarios
evitan esta comprobación).
Para agregar una tabla a una publicación, el usuario que la invoca debe ser propietario de la
tabla. Las cláusulas FOR ALL TABLES y FOR TABLES IN SCHEMA
requieren que el usuario que las invoca sea un superusuario.
Las tablas agregadas a una publicación que publica operaciones UPDATE
y/o DELETE deben tener definida una REPLICA IDENTITY.
De lo contrario, esas operaciones no se permitirán en esas tablas.
Cualquier lista de columnas debe incluir las columnas de la REPLICA IDENTITY
para que se puedan publicar las operaciones UPDATE o DELETE.
No hay restricciones en la lista de columnas si la publicación solo publica operaciones
INSERT.
Una expresión de filtro de filas (es decir, la cláusula WHERE) debe contener solo
columnas que estén cubiertas por la REPLICA IDENTITY para que se puedan publicar
las operaciones UPDATE y DELETE. Para la publicación de
operaciones INSERT, se puede utilizar cualquier columna en la expresión
WHERE. El filtro de filas permite expresiones simples que no tengan funciones
definidas por el usuario, operadores definidos por el usuario, tipos definidos por el usuario,
colaciones definidas por el usuario, funciones integradas que no sean inmutables o referencias a
columnas del sistema.
Las columnas generadas que forman parte de la REPLICA IDENTITY deben publicarse
explícitamente, ya sea listándolas en la lista de columnas o habilitando la opción
publish_generated_columns, para que se puedan publicar las operaciones
UPDATE y DELETE.
El filtro de filas en una tabla se vuelve redundante si se especifica
FOR TABLES IN SCHEMA y la tabla pertenece al esquema referido.
Para las tablas particionadas publicadas, el filtro de filas para cada partición se toma de la
tabla particionada publicada si el parámetro de publicación publish_via_partition_root
es true, o de la partición misma si es false (el valor predeterminado). Consulta la
Section 29.4 para obtener detalles sobre los filtros de filas.
De manera similar, para las tablas particionadas publicadas, la lista de columnas para cada partición
se toma de la tabla particionada publicada si el parámetro de publicación
publish_via_partition_root es true, o de la partición misma si es false.
Para un comando INSERT ... ON CONFLICT, la publicación publicará la operación
que resulte del comando. Dependiendo del resultado, puede publicarse como un INSERT
o un UPDATE, o puede no publicarse en absoluto.
Para un comando MERGE, la publicación publicará un INSERT,
UPDATE o DELETE por cada fila insertada, actualizada o eliminada.
Asociar (ATTACH) una tabla a un árbol de partición cuya raíz se publica utilizando
una publicación con publish_via_partition_root establecido en true
no hace que se replique el contenido existente de la tabla.
Los comandos COPY ... FROM se publican como operaciones INSERT.
Las operaciones DDL no se publican.
La expresión de la cláusula WHERE se ejecuta con el rol utilizado para la
conexión de replicación.
Crea una publicación que publica todos los cambios en dos tablas:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
Crea una publicación que publica todos los cambios de los departamentos activos:
CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);
Crea una publicación que publica todos los cambios en todas las tablas:
CREATE PUBLICATION alltables FOR ALL TABLES;
Crea una publicación que solo publica operaciones INSERT en una tabla:
CREATE PUBLICATION insert_only FOR TABLE mydata
WITH (publish = 'insert');
Crea una publicación que publica todos los cambios para las tablas
users, departments y
todos los cambios para todas las tablas presentes en el esquema
production:
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
Crea una publicación que publica todos los cambios para todas las tablas presentes en
los esquemas marketing y
sales:
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
Crea una publicación que publica todos los cambios para la tabla users,
pero replica solo las columnas user_id y
firstname:
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
CREATE PUBLICATION es una extensión de PostgreSQL.