通常,訂閱者上的表會與釋出者表定義相同,因此如果釋出者表具有GENERATED 列
,則訂閱者表也會有一個匹配的生成列。在這種情況下,始終使用訂閱者表的生成列值。
例如,請注意下面訂閱者表中的生成列值來自訂閱者列的計算。
/* pub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a + 1) STORED); /* pub # */ INSERT INTO tab_gen_to_gen VALUES (1),(2),(3); /* pub # */ CREATE PUBLICATION pub1 FOR TABLE tab_gen_to_gen; /* pub # */ SELECT * FROM tab_gen_to_gen; a | b ---+--- 1 | 2 2 | 3 3 | 4 (3 rows) /* sub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a * 100) STORED); /* sub # */ CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=test_pub' PUBLICATION pub1; /* sub # */ SELECT * from tab_gen_to_gen; a | b ---+---- 1 | 100 2 | 200 3 | 300 (3 rows)
事實上,在 18.0 版本之前,邏輯複製根本不釋出 GENERATED
列。
但是,有時將生成列複製到常規列可能是有益的。
當透過輸出外掛將資料複製到非 PostgreSQL 資料庫時,此功能可能很有用,尤其是在目標資料庫不支援生成列的情況下。
生成列預設不釋出,但使用者可以選擇像常規列一樣釋出儲存的生成列。
有兩種方法可以做到這一點:
將 PUBLICATION
引數 publish_generated_columns
設定為 stored
。這會指示 PostgreSQL 邏輯複製釋出釋出者表中當前和將來的儲存的生成列。
指定表列列表,以明確指定將釋出哪些儲存的生成列。
在確定將釋出哪些表列時,列列表具有優先權,會覆蓋 publish_generated_columns
引數的效果。
下表總結了邏輯複製涉及生成列時的行為。結果顯示了未啟用釋出生成列以及啟用釋出生成列時的情況。
表 29.2. 複製結果摘要
釋出生成列? | 釋出者表列 | 訂閱者表列 | 結果 |
---|---|---|---|
否 | GENERATED | GENERATED | 釋出者表列未複製。使用訂閱者表的生成列值。 |
否 | GENERATED | regular | 釋出者表列未複製。使用訂閱者表常規列的預設值。 |
否 | GENERATED | --missing-- | 釋出者表列未複製。無操作。 |
是 | GENERATED | GENERATED | 錯誤。不支援。 |
是 | GENERATED | regular | 釋出者表列值已複製到訂閱者表列。 |
是 | GENERATED | --missing-- | 錯誤。該列在訂閱者表中被報告為缺失。 |
目前不支援包含多個釋出者,其中同一個表被髮布者具有不同的列列表。請參閱 第 29.5 節。
如果一個釋出者正在釋出生成列,而同一訂閱中的另一個釋出者沒有為同一個表釋出生成列,那麼也會發生同樣的情況。
如果訂閱者來自 18 版本之前的版本,那麼即使生成列在釋出者中定義,初始表同步也不會複製生成列。
如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。