2010-04-30 36 views
11

Tôi sử dụng Postgresql với phần mở rộng PostGIS cho phân tích không gian đặc biệt. Tôi thường xây dựng và phát hành các truy vấn SQL bằng tay từ bên trong psql. Tôi luôn quấn một phiên phân tích trong một giao dịch, vì vậy nếu tôi đưa ra một truy vấn phá hoại, tôi có thể cuộn nó lại.Tôi có thể yêu cầu Postgresql bỏ qua các lỗi trong một giao dịch

Tuy nhiên, khi tôi đưa ra truy vấn có lỗi, nó sẽ hủy giao dịch. Mọi truy vấn khác gợi ý cảnh báo sau:

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

Có cách nào để tắt hành vi này không? Đó là mệt mỏi để rollback giao dịch và chạy lại truy vấn trước đó mỗi khi tôi thực hiện một lỗi đánh máy.

Trả lời

10

(UPDATE: Không cần phải đến điều này bằng tay, tôi hỏi trong danh sách postgresql gửi thư, và nó bật rằng hành vi này đã được thực hiện, bởi ON_ERROR_ROLLBACK bộ trong các khách hàng psql)

Để xây dựng trên Simon câu trả lời (+1), trong kịch bản của bạn, bạn có thể thêm một điểm lưu trữ sau mỗi truy vấn tương tác, luôn luôn có cùng tên (nó ghi đè trước đó nếu truy vấn thành công). Trong trường hợp lỗi, bạn quay trở lại lần lưu cuối cùng và tiếp tục từ đó.

Một ví dụ về mô hình làm việc này:

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

biến ON_ERROR_ROLLBACK thực hiện chính xác những gì tôi muốn :) – fmark

+0

'ON_ERROR_ROLLBACK' trông giống như một tính năng của máy khách psql, chứ không phải postgres (vì vậy bạn không thể sử dụng nó từ ứng dụng cơ sở dữ liệu, chỉ từ dòng lệnh). – Glyph

+1

@Glyph: vâng, đó là một tính năng cho psql, nó đặc biệt hướng tới việc sử dụng tương tác - đó là kịch bản của OP. Thật khó cho tôi để nghĩ về một kịch bản ứng dụng khi hành vi mong muốn sẽ có ý nghĩa. – leonbloy

2

Không, không có cách nào để tắt tính năng này. Một lỗi ngầm loại bỏ giao dịch cho bạn, vì vậy bạn phải quay lại và thử lại.

+0

+1 thực sự (15 ký tự) –

+0

Tôi cũng nghĩ như vậy, nhưng không. Xem câu trả lời của tôi. – leonbloy

1

Có thể viết hàm nhận đối số chuỗi, executes và sử dụng mệnh đề exception để không hủy giao dịch của bạn, nhưng thật khó để gọi hàm đó cho từng câu lệnh mà bạn muốn thi hành.

4

Việc tắt tính năng này không thể thực hiện được tuy nhiên bạn có thể sử dụng thứ gì đó khác. Có cái gì đó như savepoint:

http://www.postgresql.org/docs/8.4/interactive/sql-savepoint.html

vì vậy bạn có thể rollback giao dịch của bạn đối với một số điểm trước đó mà không cần lăn đen toàn bộ giao dịch.

0

Câu trả lời đơn giản là chạy

my_db=> \set ON_ERROR_ROLLBACK interactive 

trong phiên tương tác. Xem thêm this blog post bởi người triển khai.

Các vấn đề liên quan