PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kann ich Postgresql bitten, Fehler innerhalb einer Transaktion zu ignorieren?

(UPDATE:Keine Notwendigkeit, dies von Hand zu tun, ich habe in den Postgresql-Mailinglisten nachgefragt, und es stellte sich heraus, dass dieses Verhalten bereits implementiert ist, durch das ON_ERROR_ROLLBACK-Set im psql-Client)

Um auf Simons Antwort (+1) einzugehen, könnten Sie in Ihrem Szenario routinemäßig nach jeder interaktiven Abfrage einen Speicherpunkt hinzufügen, immer mit demselben Namen (er überschreibt den vorherigen, wenn die Abfrage erfolgreich ist). Im Fehlerfall kehren Sie zum zuletzt gespeicherten zurück und machen dort weiter.

Ein Beispiel für dieses Arbeitsmuster:

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)