2010-04-30 73 views
11

我使用Postgresql和PostGIS擴展進行專門的空間分析。我通常在psql中手工構建和發佈SQL查詢。我總是在一個事務中包裝一個分析會話,所以如果我發出一個破壞性的查詢,我可以將其回滾。我可以讓Postgresql忽略交易中的錯誤嗎?

但是,當我發出包含錯誤的查詢時,它會取消該事務。任何進一步的查詢引起以下警告:

ERROR: current transaction is aborted, commands ignored until end of transaction block

有沒有辦法可以將此行爲關閉?每次我輸入錯字時,回滾事務並重新運行以前的查詢都很麻煩。

回答

10

(UPDATE:沒有必要對這一手,我問PostgreSQL的郵件列表,並且事實證明,這種行爲已經實施,由PSQL客戶端ON_ERROR_ROLLBACK集)

爲了詳細說明西蒙回答(+1),在你的場景中,你可以在每個交互式查詢之後添加一個保存點,並始終使用相同的名稱(如果查詢成功,它會覆蓋前一個)。在發生錯誤的情況下,您將返回上次保存的狀態並從此處繼續。

這種工作模式的一個例子:

db=# select * from test_gral ; 
i | t | n 
---+------+------ 
1 | text | 10.0 
(1 row) 

db=# begin; 
BEGIN 
db=# insert into test_gral values (2,'xx',20); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# insert into test_gral values (3,'xx',30); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# insert into test_gralxx values (4,'xx',40); savepoint sp; 
ERROR: relation "test_gralxx" does not exist 
LINE 1: insert into test_gralxx values (4,'xx',40); 
        ^
ERROR: current transaction is aborted, commands ignored until end of transaction block 
db=# ROLLBACK TO SAVEPOINT sp; 
ROLLBACK 
db=# insert into test_gral values (4,'xx',40); savepoint sp; 
INSERT 0 1 
SAVEPOINT 
db=# commit; 
COMMIT 
db=# select * from test_gral ; 
i | t | n 
---+------+------ 
1 | text | 10.0 
2 | xx | 20 
3 | xx | 30 
4 | xx | 40 
(4 rows) 
+0

ON_ERROR_ROLLBACK變量確實是我想要的:) – fmark 2010-05-01 06:20:03

+0

'ON_ERROR_ROLLBACK'雖然看起來像psql客戶端的一個功能,但不是postgres自身(所以你不能從數據庫應用程序使用它,只能從命令行使用)。 – Glyph 2012-03-02 17:17:49

+1

@Glyph:是的,這是psql的一項功能,它專門面向交互式使用 - 這是OP的場景。當期望的行爲有意義時,我很難想到應用場景。 – leonbloy 2012-03-02 18:27:41

2

不,沒有辦法關閉它。一個錯誤會隱式中止您的事務,因此您必須回滾並再次嘗試。

+0

+1確實(15個字符) – 2010-04-30 02:54:00

+0

我也這麼認爲,但沒有。看到我的答案。 – leonbloy 2010-04-30 17:03:09

1

可以編寫一個函數,該函數接受一個字符串參數executes it,並使用exception子句以不中止事務,但是如果要爲每個要執行的語句調用該函數是一件非常痛苦的事情執行。

0

簡單的答案是在交互式會話中運行

my_db=> \set ON_ERROR_ROLLBACK interactive 

。其實現者也可參見this blog post

相關問題