发布使用的列列表不涵盖副本身份。无法更新表 - 逻辑复制 - Postgres 15

问题描述 投票:0回答:1

我们正在两个数据库之间进行 Postgres 本机逻辑复制。

现在,我们在尝试从发布者那里更新我们拥有的一千个表中的一个时遇到错误。

当我们尝试更新表时,它返回此错误:

错误:发布使用的列列表未涵盖副本身份。无法更新表“etiquetas_j”。

错误:无法更新表“etiquetas_j” 国家 SQL:42P10 详细:发布使用的列列表不涵盖副本身份。

发布者和订阅者的表定义、数据类型、索引和 pkey 相同

看这里:

出版商

    CREATE TABLE IF NOT EXISTS public.etiquetas_j (
    etiqueta_id integer NOT NULL,
    fecha timestamp without time zone,
    j_id integer NOT NULL,
    usuario_del_id integer,
    usuario_mod_id integer,
    organigrama_mod character varying(2) COLLATE pg_catalog."default",
    id integer NOT NULL DEFAULT nextval('etiquetas_j_id_seq1'::regclass),
    CONSTRAINT etiquetas_j_pkey PRIMARY KEY (id))
TABLESPACE pg_default; ALTER TABLE IF EXISTS public.etiquetas_j
    OWNER to postgres;


CREATE INDEX IF NOT EXISTS etiquetas_j_etiqueta_id_idx
    ON public.etiquetas_j USING btree
    (etiqueta_id ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS etiquetas_j_j_id_idx
    ON public.etiquetas_j USING btree
    (j_id ASC NULLS LAST)
    TABLESPACE pg_default;

订阅者

CREATE TABLE IF NOT EXISTS public.etiquetas_j
(
    etiqueta_id integer NOT NULL,
    fecha timestamp without time zone,
    j_id integer NOT NULL,
    usuario_del_id integer,
    usuario_mod_id integer,
    organigrama_mod character varying(2) COLLATE pg_catalog."default",
    id integer NOT NULL DEFAULT nextval('etiquetas_j_id_seq1'::regclass),
    CONSTRAINT etiquetas_j_pkey PRIMARY KEY (id)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.etiquetas_j
    OWNER to postgres;

CREATE INDEX IF NOT EXISTS etiquetas_j_etiqueta_id_idx
    ON public.etiquetas_j USING btree
    (etiqueta_id ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS etiquetas_j_id_idx
    ON public.etiquetas_j USING btree
    (j_id ASC NULLS LAST)
    TABLESPACE pg_default;

出版物定义如下:

CREATE PUBLICATION publication_visor FOR TABLE etiquetas_j(etiqueta_id, fecha, id, j_id, usuario_del_id, usuario_mod_id, organigrama_mod)

我们在provider中执行时出现错误:

update etiquetas_j set organigrama_mod = '02' where id = 3;

谢谢,抱歉英语不好!

我们已经检查过:

  1. 看看索引是什么。
  2. 看看两种模式有何不同。
  3. 查看发布者在出版物创建时发送的内容。
  4. 应用 ALTER TABLE etiquetas_j REPLICA IDENTITY FULL;
postgresql database-replication logical-replication postgresql-15
1个回答
0
投票

当表的副本标识未完全被发布中提供的列覆盖时,您将收到错误“发布使用的列列表未覆盖副本标识”。在您的情况下,您在表

etiquetas_j
上定义了一个发布,其中包含指定列的列表。尽管它不是出版物中所述的列之一 (
etiqueta_id
fecha
id
j_id
usuario_del_id
usuario_mod_id
organigrama_mod
),但
organigrama_mod
列会在以下情况下更新:您尝试编辑表格。

您必须检查副本标识中涉及的列(主键或唯一约束列)是否列在发布列列表中才能解决此问题。您案例中的

id
列似乎是主键,并且您已将其包含在出版物中。不过,
organigrama_mod
列似乎已更新,而不是副本身份的一部分。

需要将

organigrama_mod
列添加到发布列列表中才能解决问题,或者如果它不是副本标识的一部分,则应避免直接编辑它。为了覆盖所有列并防止将来出现问题,您可能还可以考虑将表的副本标识更改为
FULL

© www.soinside.com 2019 - 2024. All rights reserved.