CREATE PUBLICATION

CREATE PUBLICATION — define una nueva publicación

Synopsis

CREATE PUBLICATION nombre
    [ FOR ALL TABLES
      | FOR objeto_publicación [, ... ] ]
    [ WITH ( parámetro_publicación [= valor] [, ... ] ) ]

donde objeto_publicación es uno de:

    TABLE tabla_y_columnas [, ... ]
    TABLES IN SCHEMA { nombre_esquema | CURRENT_SCHEMA } [, ... ]

y tabla_y_columnas es:

    [ ONLY ] nombre_tabla [ * ] [ ( nombre_columna [, ... ] ) ] [ WHERE ( expresión ) ]

Descripció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.

Parámetros

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.

Note

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.

Notas

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.

Ejemplos

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);

Compatibilidad

CREATE PUBLICATION es una extensión de PostgreSQL.

Consulte también

ALTER PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION