2010-04-30 101 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

相关问题