【发布时间】:2022-08-23 19:59:29
【问题描述】:
我正在试验 PostgreSQL15 逻辑复制。
我在数据库 \"test1\" 中有一个名为 \"test\" 的表,其中包含列 \"id\" int (primary) 和 \"name\" varchar
id int (primary) | name varchar
我在数据库 \"test0\" 中还有一个名为 \"test\" 的表,其中包含 \"tenant\" int (primary)、\"id\" int (primary) 和 \"name\" varchar 列
tenant int (primary/default=1) | id int (primary) | name varchar
我在数据库 \"test1\" 上有以下发布者
CREATE PUBLICATION pb_test FOR TABLE test (\"id\", \"name\")
SELECT pg_create_logical_replication_slot(\'test_slot_v1\', \'pgoutput\');
我也有以下订户数据库 \"test0\"
CREATE SUBSCRIPTION sb_test CONNECTION \'dbname=test1 host=localhost port=5433 user=postgres password=*********\' PUBLICATION pb_test WITH (slot_name = test_slot_v1, create_slot = false);
结果是每次在数据库 \"test1\" 上添加一条新记录时,都会在数据库 \"test0\" 上插入相同的记录,并且默认值是tenant=1。
问题是,有没有办法在复制时为这个附加列“租户”自定义表达式?例如,来自数据库\"test1\" 的记录应该有tenant=1,但是来自数据库\"test2\" 的记录应该有tenant=2。
-
在订阅者表中添加一个整数列,默认值为 1(对于来自发布者的行),并在本地插入订阅者数据库时强制为 2
-
当从不同的订阅者插入时,您将如何强制租户 = 2 和租户 = 3?
-
不确定这是您要查找的内容,但是,在订阅者表中有一个额外的列(比如说
src int default 1)可以让您区分这些行是来自发布者还是来自订阅者数据库。来自发布者的行将有一个默认的1值src;通过在插入/更新 SQL 语句中包含src = 2,可以强制在订阅者数据库本地插入的行具有2。 -
可能是的,但是从 Postgres 投资于逻辑复制的那一刻起,为什么不拥有这些好处呢?在数据库内部有这个更清晰的解决方案。
-
是的,也许使用 Azure 数据工厂和经典的旧 ETL 样式会更好。也许不是流式传输,但高频可能可以接近实时存档……
标签: database postgresql expression replication reporting