【问题标题】:PostgreSQL Logical Replication Custom Column ExpressionPostgreSQL 逻辑复制自定义列表达式
【发布时间】: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)可以让您区分这些行是来自发布者还是来自订阅者数据库。来自发布者的行将有一个默认的1src;通过在插入/更新 SQL 语句中包含 src = 2,可以强制在订阅者数据库本地插入的行具有 2
  • 可能是的,但是从 Postgres 投资于逻辑复制的那一刻起,为什么不拥有这些好处呢?在数据库内部有这个更清晰的解决方案。
  • 是的,也许使用 Azure 数据工厂和经典的旧 ETL 样式会更好。也许不是流式传输,但高频可能可以接近实时存档……

标签: database postgresql expression replication reporting


【解决方案1】:

似乎目前,PostgreSQL 逻辑复制不支持此要求具有具有固定值的附加列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多