Question

Je travaille sur des scripts qui appliquent les mises à jour du schéma de base de données. J'ai configuré tous mes scripts de mise à jour SQL à l'aide de start transaction / commit. Je passe ces scripts à psql en ligne de commande.

Je dois maintenant appliquer plusieurs scripts en même temps et en une seule transaction. Jusqu'à présent, la seule solution que j'ai proposée consiste à supprimer la transaction de début / validation du jeu de scripts d'origine, puis à les regrouper dans un nouveau bloc de transaction / validation de démarrage. J'écris des scripts Perl pour le faire à la volée.

En fait, je veux des transactions imbriquées, ce que je ne peux pas comprendre comment faire avec postgresql.

Existe-t-il un moyen de créer ou de simuler des transactions imbriquées à cette fin? Les choses sont configurées pour résoudre automatiquement toute erreur. Je n'ai donc pas besoin de continuer dans la transaction de niveau supérieur si l'une des plus basses échoue.

Était-ce utile?

La solution

Vous avez la possibilité d’utiliser des transactions imbriquées dans postgresql à l’aide de SavePoints.

Prenez cet exemple de code:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

Peut-être que cela vous aidera un peu.

Autres conseils

J'ai fini par résoudre mon problème hors du groupe - j'utilise un script Perl pour retravailler les scripts d'entrée afin d'éliminer leurs appels de transaction / validation de démarrage, puis de les placer tous dans un fichier, qui obtient son propre fichier. démarrer la transaction / commit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top