2013-02-06 135 views
1

有沒有辦法保存,暫時更改,然後恢復變量的值psqlON_ERROR_STOP如何保存和恢復ON_ERROR_STOP的值?

基本上,我想有一個psql腳本下面的「道德等價物」:

save_on_error_stop=ON_ERROR_STOP 

\unset ON_ERROR_STOP 
ALTER TABLE foo DROP COLUMN bar; -- (for example) 
\set ON_ERROR_STOP save_on_error_stop 

ALTER TABLE foo ADD COLUMN bar; 

問題的關鍵是,在年底'\set'命令實際上不會設置ON_ERROR_STOP除非它是之前設置的。

回答

2

我不認爲有可能在單一的psql會話中做到這一點。根據manual,可以自行使用\set命令列出所有psql變量。

可以記住shell中的設置,但這會使整件事變得無用,因爲只需執行所需的一組查詢來執行所需的ON_ERROR_STOP值就簡單多了。

另一種替代方法是編寫匿名代碼塊和DO一些額外的邏輯來檢測列是否需要在添加之前被刪除。

順便說一句,什麼是直接刪除和添加列的目的?


如果只是以確保沒有存在這樣的列,如何回合此DO塊:

DO $$ 
BEGIN 
IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns 
    WHERE table_schema='public' AND table_name='foo' 
     AND column_name='bar') 
THEN 
    EXECUTE format('ALTER TABLE %I.%I ADD %I text', 
        'public','foo','bar'); 
END IF; 
END; $$; 

您還可以,如果你傾向於做這樣的檢查往往創建一個函數。

+0

我想避免'ADD COLUMN'上只有'columns already exists'錯誤,但是用\ \ unset''' \ set'對括起這個命令會使每個*非致命錯誤都變得沉默,太多了。我發佈的方法可以更有選擇性地避免「列已存在」錯誤。這並不完美:它依賴於'DROP COLUMN'行成功的隱含假設,或者'列不存在'失敗而失敗,或者由於條件導致「ADD COLUMN」失敗而失敗。 ... – kjo

+0

...這些案例幾乎可以肯定不能涵蓋所有可能性,但它們涵蓋了我的代碼將面臨的最常見情況。 – kjo