2013-03-13 57 views
1

我有一些使用PostgreSQL數據庫的項目,它使用了19個存儲過程(函數)和大約70個視圖。如何自動postgress導入和導出功能和視圖

現在,我們對活動數據庫做了一些更新,並且由於postgres的限制,需要刪除並重新創建所有函數和視圖,因此功能發生了變化,因此我們花了相當長的時間來完成這些工作。

是否有一種自動方式來改變函數和視圖在postgress中的方式,它需要關心依賴關係並按正確的順序執行。

我們有再創建上層的意見......它有點複雜的數據庫,至少對我來說:)

感謝

回答

2

我認爲這樣做最簡單的方法是將備份的基本觀點數據庫到文本文件:

pg_dump database_name > database_name.pg_dump 

它們將處於正確的依賴關係順序,否則從備份恢復數據庫將很困難。您可以在備份文件中編輯功能和查看定義,並將其恢復到新數據庫。

如果數據庫備份文件太大而無法在編輯器進行編輯,從Postgres的9.2,可以將其分爲3個部分:

pg_dump --section=pre-data > database_name.1.pg_dump 
pg_dump --section=data > database_name.2.pg_dump 
pg_dump --section=post-data > database_name.3.pg_dump 

你只編輯的第一部分,這將是小。在舊版本中,您可以使用例如split實用程序。

如果您無法承擔備份和恢復所需的停機時間,它會變得更加棘手。但我仍然建議使用備份文件。請記住,Postgres在事務中支持DDL - 如果您在事務中導入函數和視圖並出現錯誤,則可以簡單地回滾所有更改,進行更正並再次嘗試。

0

沒有「簡單」的方法。最好的方法是首先準備好IMO,然後設置一種使用SQL腳本和版本控制的方法。

我們在LedgerSMB中做的是我們將函數定義保存在一系列.sql文件中,這些文件在subversion中進行跟蹤。然後我們有一個腳本來重新加載它們。如果你之前沒有這樣做,這將需要一些工作來設置。要做到這一點最簡單的方法是:

pg_dump -s > ddl_statements_for_mydb.sql 

然後你可以複製/粘貼功能定義(CREATE變化要創建或替換,或添加DROP IF EXISTS如適用)。然後你會想要模塊化成可用的塊,並有一個腳本將所有塊按照正確的順序重新加載到你的數據庫中。現在設置一切的時間和精力將會節省很多次,因爲您可以將可預測的變更應用到測試,分期和生產帳戶,而無需明顯的停機時間(甚至可能根本沒有停機時間,具體取決於如何你構造它)。