Postgresql

替換 Postgres 中的物化視圖

  • October 7, 2021

我有一個物化視圖Postgres 9.3,我想用新列進行更新。但是,其他物化視圖也依賴於該視圖,並且錯誤消息表明當其他對象依賴於該視圖時,無法刪除該視圖。

錯誤:無法刪除物化視圖 latest_charges,因為其他對象依賴於它

從文件中還可以看出,REPLACE 關鍵字對於物化視圖無效。除了刪除所有依賴對象並重建每個對象之外,還有什麼捷徑嗎?

從 PostgreSQL 9.4 開始:與CREATE VIEW的文件不同,CREATE MATERIALIZED VIEW的文件沒有提到 REPLACE 關鍵字。除了刪除所有依賴對象並重建每個對象之外,似乎沒有捷徑可走。

當你這樣做時,我只能推薦兩件小事:

  1. 使用 DROP MATERIALIZED VIEW blabla CASCADE 獲取所有依賴對象的列表
  2. 在一個事務中刪除和重新創建所有依賴對象。

對於我的情況,我更喜歡使用視圖層來限制下降:

  1. 創建以“_new”為後綴的物化視圖的副本,並使用“WITH NO DATA”來提高性能,確保還使用後綴創建任何索引以及通過 DROP…CASCADE 發現的任何其他依賴對象
  2. 在新的物化視圖上創建一個視圖以提供抽象層,因此我只需要在一個地方更改它
  3. ALTER 現有依賴項改為引用新視圖(如果需要提前刷新數據)
  4. 刪除現在不應有任何依賴項的原始物化視圖和索引
  5. 更改物化視圖和索引以刪除後綴以恢復原始名稱

例如。

create table test (myfield int);
insert into test values (1);
create materialized view mv_test as select myfield from test;
create view v_test as select myfield from mv_test;
select * from v_test;
create materialized view mv_test_new as select myfield, myfield+1 as myfield2 from test;
alter view v_test rename to v_test_old;
alter materialized view mv_test rename to mv_test_old;
create view v_test as select myfield,myfield2 from mv_test_new;
select * from v_test;
alter materialized view mv_test_new rename to mv_test;
drop view v_test_old; -- when ready
drop materialized view mv_test_old; -- when ready

引用自:https://dba.stackexchange.com/questions/56304