首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以要求Postgresql忽略事务中的错误吗?

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

Stack Overflow用户
提问于 2010-04-30 02:14:46
回答 5查看 25.5K关注 0票数 15

我将Postgresql与PostGIS扩展一起用于即席空间分析。我通常从psql内部手工构造和发出SQL查询。我总是在事务中包装分析会话,所以如果我发出破坏性查询,就可以回滚它。

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

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

有什么办法可以让我停止这种行为吗?每次输入错误时,回滚事务并重新运行以前的查询都是令人厌烦的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-30 15:30:40

(更新:不需要手工操作,我在postgresql邮件列表中询问,它已经实现了这种行为,由psql客户机中的回滚设置)

为了详细说明Simon的答案(+1),在您的场景中,您可以在每个交互查询之后添加一个保存点,始终使用相同的名称(如果查询成功,它将写入前面的内容)。在出现错误的情况下,您将返回到最后一个保存的错误,然后从那里继续。

这种工作模式的一个例子是:

代码语言:javascript
复制
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)
票数 14
EN

Stack Overflow用户

发布于 2010-04-30 07:47:12

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

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

因此,您可以将事务回滚到以前的某个点,而不必将整个事务转黑。

票数 6
EN

Stack Overflow用户

发布于 2010-04-30 04:22:08

可以编写一个函数,它接受一个字符串参数,执行它,并使用一个异常子句,以便不中止您的事务,但如果要执行的每个语句都必须调用该函数,这将是非常痛苦的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2741919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档