我正在尝试创建一个逻辑复制设置,其中有一个大型数据库,其中较小的只读副本分支是根据子 ID 进行过滤的。
例如,如果我想要将项目子集推送到特定客户的只读副本,我可能在复制节点上有一个由以下定义的表:
CREATE TABLE public.item (
id text PRIMARY KEY,
data text,
customer_id integer
);
我可能有也可能没有sub_id
订阅节点(不是破坏交易的细节)。在复制节点上,我可以根据需要将数据添加到表中,直到创建 PUBLICATION,如下所示:
CREATE PUBLICATION customer_items FOR TABLE public.item (
id,
data
) WHERE (customer_id = 3);
此时,我尝试类似的事情
UPDATE public.item SET
customer_id = 3 WHERE
id = 'GLAMDRING';
我收到错误我收到SQL state: 42P10
错误,或者...:
ERROR: cannot update table "item"
DETAIL: Column used in the publication WHERE expression is not part of the replica identity.
STATEMENT: UPDATE public.item SET
customer_id = $1::integer WHERE
id = 'GLAMDRING';
这里的问题看起来很相似。我已经按照那里的建议重新创建了表以删除 上的任何 ALTER TABLE 语句id
,但我得到了相同的结果。
我发现使用此逻辑复制功能的大多数示例都不会使用 WHERE 子句。我想我要么误解了这个功能背后的含义,要么我发现了一个错误/限制。
请注意:我知道我的示例似乎微不足道,应该通过其他方式解决。为了简洁起见,这是我的问题的简化版本。
更新
尝试使用唯一索引,正如建议的那样,几乎让我到达了那里。
CREATE UNIQUE INDEX id_customerid_idx ON public.item ((customer_id || id));
但是当我尝试创建有用的出版物时..
CREATE PUBLICATION customer_items FOR TABLE public.item (id, data) WHERE (customer_id || id LIKE '3%');
新错误:
ERROR: User-defined or built-in mutable functions are not allowed.invalid publication WHERE expression
ERROR: invalid publication WHERE expression
SQL state: 0A000
Detail: User-defined or built-in mutable functions are not allowed.
Character: 377
也许我的用例有点疯狂,或者我需要重新考虑我的应用程序逻辑以处理这些约束。我在这里错过了一个明显的工作吗?
这是按设计工作™
我认为限制是为了适应
UPDATE
转换:其中“old”和“new”是副本标识值,因此过滤器列必须是其中的一部分。