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

Kan jeg bede Postgresql om at ignorere fejl i en transaktion

(OPDATERING:Det er ikke nødvendigt at gøre dette manuelt, jeg spurgte i postgresql-mailinglisterne, og det viste sig, at denne adfærd allerede er implementeret af ON_ERROR_ROLLBACK indstillet i psql-klienten)

For at uddybe Simons svar (+1) kan du i dit scenarie rutinemæssigt tilføje et lagringspunkt efter hver interaktiv forespørgsel, altid med det samme navn (det overskriver det foregående, hvis forespørgslen er vellykket). I tilfælde af fejl går du tilbage til den sidst gemte og fortsætter derfra.

Et eksempel på dette arbejdsmønster:

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)


  1. SQL Server Transaction Log — Del 2

  2. Jeg prøver at kopiere en fil, men får fejlmeddelelse

  3. hvordan kalder man en lagret proc fra støvknapper og ændrer refcursor, der returneres?

  4. Forbindelsespuljen for databasen '/data/data/msv_database.db' har ikke været i stand til at give en forbindelse. Forbindelser:0 aktiv, 1 inaktiv, 0 tilgængelig