2013-10-22 44 views
2

根據某些情況,我在PostgreSQL中有一個視圖,它既可以是普通的也可以是物化的。我試圖編寫一個查詢,可以肯定地放下視圖,而且無論現在的類型如何,都不會有錯誤。但是,這似乎並不容易。當我嘗試使用下面的代碼,我得到一個錯誤:在一個查詢中刪除Postgresql 9.3中的普通或實例化視圖

DROP VIEW IF EXISTS {{ schema }}.{{ viewName }}; 
DROP MATERIALIZED VIEW IF EXISTS {{ schema }}.{{ viewName }}; 

SQLSTATE[42809]: Wrong object type: 7 ERROR: "{{ viewName }}" is not a view 
HINT: Use DROP MATERIALIZED VIEW to remove a materialized view.  

因此,它看起來像「IF存在」的第一行中產生真正的視圖時物化,DROP命令啓動,但因視圖類型錯誤而失敗(這是不正常的)。任何人都可以提出一個通用的解決方法,既可以用於物化視圖,也可以用於普通視圖。

回答

1

沒有。無論如何,或者不容易......正如Postgres報道的那樣,兩者是不同的動物。

如果存在踢的原因,我認爲,由於這一切都存在於pg_class。如果您創建測試表並嘗試運行drop view if exists test,則會出現類似的錯誤。

在檢查pg_catalog.pg_class中的實體類型以確定您正在處理的內容的確切類型之後,您可以作爲一個不太好的解決方法,在DO塊中生成動態SQL語句(表,視圖,席子視圖等)。