0

我的數據庫是PostgreSQL(9.3.5)。如何使用PostgreSQL中的EXECUTE語句刪除物化視圖

我們有超過500個物化視圖,並希望刪除其中的一些。
爲此,我們從這些物化視圖取出由pg_class

FOR MVNAME IN (SELECT relname 
      FROM pg_class 
      WHERE relkind='m') 

LOOP 
    EXECUTE 'DROP MATERIALIZED VIEW '||MVNAME||''; 
END LOOP; 

在執行時它給了我們一個錯誤:

ERROR: "dimension" is not a materialized view 
SQL state: 42809 

Hint: Use DROP FOREIGN TABLE to remove a foreign table. 
Context: SQL statement "DROP MATERIALIZED VIEW dimension" 
PL/pgSQL function test_drop_dims() line 14 at EXECUTE statement 

我們可以刪除一個物化視圖使用:

DROP MATERIALIZED VIEW MVNAME; 

但我們不能使用EXECUTE語句刪除多個物化視圖。

回答

2

錯誤消息指示您使用雙引號創建了非標準名稱,如"Dimension"(混合大小寫)。您需要在動態SQL中正確使用引用和轉義標識符。不僅因爲它不以其他方式工作,還要避免SQL注入
另外,您可能需要架構限定名稱。詳細信息:

此外,您可以drop multiple MV's at once,並不需要一個循環是這樣的:

EXECUTE (
    SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ') 
    FROM pg_class 
    WHERE relkind = 'm' 
    ); 

小心一點!掉落全部的物化視圖全部您當前數據庫的模式。您可能需要首先仔細檢查。

請注意我如何使用oid::regclass::text而不是quote_ident(relname)。這也會自動覆蓋模式名稱。 Detailed explantaion in the provided link.

+0

@a_horse_with_no_name:如果您執行語句「DROP TABLE dimension」或「DROP TABLE Dimension」(同樣的事情),系統如何知道您的意思是「Dimension」還是「diMenSion」?錯誤信息報告你輸入的內容,摺疊成小寫,除非用雙引號,就是這樣。請參閱:http://sqlfiddle.com/#!15/d41d8/4009 – 2014-11-25 15:54:28