我可以要求Postgresql忽略事务中的错误

时间:2010-04-30 02:14:46

标签: database postgresql postgis

我使用Postgresql和PostGIS扩展进行临时空间分析。我通常在psql中手工构造和发出SQL查询。我总是在一个事务中包装一个分析会话,所以如果我发出一个破坏性的查询,我可以回滚它。

但是,当我发出包含错误的查询时,它会取消该事务。任何进一步的查询都会引发以下警告:

  

错误:当前交易是   中止,命令被忽略直到结束   交易块

有没有办法可以解决这个问题?每次我输错时,回滚事务并重新运行以前的查询都很烦人。

5 个答案:

答案 0 :(得分:11)

(更新:无需亲自操作,我在postgresql邮件列表中询问,并且它已经通过psql客户端中的ON_ERROR_ROLLBACK设置已经实现了此行为)

要详细说明Simon的答案(+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)

答案 1 :(得分:6)

无法关闭此功能,但您可以使用其他功能。有一点像保存点:

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

因此您可以将事务回滚到某个早期点,而不会使整个事务变黑。

答案 2 :(得分:1)

可以编写一个带有字符串参数的函数executes,并使用exception子句以便不中止您的事务,但是那时必须调用它才是一个巨大的痛苦您希望执行的每个语句的函数。

答案 3 :(得分:0)

不,没有办法把它关掉。错误会隐式中止您的事务,因此您必须回滚并重试。

答案 4 :(得分:0)

简单的答案是运行

my_db=> \set ON_ERROR_ROLLBACK interactive

在交互式会话中。另见其实施者this blog post