15

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

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

错误:当前事务被中止,命令被忽略直到事务块结束

有没有办法可以关闭这种行为?每次我打错字时回滚事务并重新运行以前的查询是很烦人的。

4

5 回答 5

14

(更新:不需要手动执行此操作,我在 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)
于 2010-04-30T15:30:40.317 回答
6

关闭它是不可能的,但是你可以使用不同的东西。有类似保存点的东西:

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

因此,您可以将事务回滚到某个较早的点,而无需将整个事务滚动为黑色。

于 2010-04-30T07:47:12.917 回答
2

可以编写一个函数,该函数接受一个字符串参数,执行它,并使用异常子句以不中止您的事务,但是随后必须为您希望执行的每个语句调用该函数是一个巨大的痛苦。

于 2010-04-30T04:22:08.447 回答
0

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

于 2010-04-30T02:18:27.043 回答
0

简单的答案是运行

my_db=> \set ON_ERROR_ROLLBACK interactive

在互动环节。另请参阅其实现者的这篇博客文章

于 2017-07-14T10:23:42.823 回答