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 に答える