PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Posso chiedere a Postgresql di ignorare gli errori all'interno di una transazione

(AGGIORNAMENTO:non c'è bisogno di farlo manualmente, ho chiesto nelle mailing list di postgresql, e si è scoperto che questo comportamento è già implementato, dall'ON_ERROR_ROLLBACK impostato nel client psql)

Per approfondire la risposta di Simon (+1) , nel tuo scenario potresti aggiungere rutinariamente un punto di salvataggio dopo ogni query interattiva, sempre con lo stesso nome (sovrascrive il precedente se la query ha successo). In caso di errore, si torna all'ultimo salvato e si prosegue da lì.

Un esempio di questo schema di lavoro:

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)