2012-05-11 81 views
2

這是我的設置。我有兩個模式:my_appstatic_data。後者從靜態轉儲中導入。對於我的應用程序邏輯的需求,我提出了使用static_data表的視圖,並將它們存儲在my_app模式中。PostgreSQL:當另一個架構的視圖依賴於它時更新架構

這一切都很好。但我需要用新的轉儲更新static_data模式,並讓我的視圖使用新數據。問題是,無論我做什麼,我的觀點都會引用舊的模式!

我試圖在新模式中導入新轉儲static_data_new,然後嘗試刪除static_data並將static_data_new重命名爲static_data。它不起作用,因爲我的視圖依賴於static_data中的表,因此PostgreSQL不會讓我刪除它。

然後我嘗試設置search_pathstatic_data_new。但是當我這樣做的時候,這些觀點仍然參考舊桌子!

是否有可能使用search_path來引用表的視圖?謝謝。

回答

3

視圖綁定到底層對象。重命名對象不會影響此鏈接。
我看基本上3種不同的方式來處理你的問題:

  1. DELETE你的意見並重新CREATE他們你在的地方您的新表(一個或多個)之後。簡單而快速,只要你有完整的創建腳本在一起。不要忘記重置權限。儘管如此,重新創建腳本可能很繁瑣。

  2. 使用表函數(函數RETURNING SETOF rowsRETURNING TABLE)而不是視圖。從而得到「後期綁定」:對象名稱將在執行時在系統目錄中查找,而不是在創建時查找。事實上,這些對象可以被找到是你的責任。

    search_path可以是pre-set per function或執行角色的search_path對於未顯式限定模式的對象有效。詳細說明和鏈接this related answer on SO

    函數基本上就像預先準備好的語句並且行爲與視圖有微妙的不同。詳情請參閱this related answer on dba.SE

  3. 採取新的數據,而不是DELETECREATETRUNCATEINSERT路線。然後所有引用保持不變。找到關於該here更詳細的答案。

    如果外鍵引用了您的表,您必須改用DELETE FROM TABLE - 或者刪除並重新創建外鍵約束。這將是你的責任,參考完整性可以恢復,或者外鍵的重新創建將失敗。

+0

感謝您的回答!我想最簡單的是使用1.並將'my_app'表存儲在另一個模式中。 – Artefact2

+0

@ Artefact2:我發現[pgAdmin](http://www.pgadmin.org/)對這種操作非常有用。它提供完整的刪除併爲任何選定的對象創建腳本。 –

+0

是的,我也使用它,雖然'pg_dump'和'pg_restore'只是更方便腳本等。 – Artefact2