Skip site navigation (1) Skip section navigation (2)

Re: Migration SQL Serveur 2008 vers PostgreSQL

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Ronan Dunklau <rdunklau(at)gmail(dot)com>
Cc: "F(dot) BROUARD / SQLpro" <sqlpro(at)club-internet(dot)fr>, pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Migration SQL Serveur 2008 vers PostgreSQL
Date: 2012-01-05 10:05:55
Message-ID: 1325757955.2277.28.camel@localhost.localdomain (view raw or flat)
Thread:
Lists: pgsql-fr-generale
On Thu, 2012-01-05 at 10:40 +0100, Ronan Dunklau wrote:
> > Voici un exemple de transactions infaisable sous PG :
> > 
> > CREATE TABLE T1 (C1 INT); CREATE TABLE T2 (C2 INT CHECK (C2 > 0)) 
> > CREATE TABLE T3 (C3 INT); GO
> > 
> > CREATE PROCEDURE P_INSERT_TRANSACTION @VAL1 INT AS BEGIN -- 
> > demarrage d'une transaction BEGIN TRANSACTION; -- test de validité
> >  BEGIN TRY INSERT INTO T1 VALUES (@VAL1); INSERT INTO T2 VALUES 
> > (@VAL1); COMMIT TRANSACTION; END TRY -- en cas d'erreur BEGIN CATCH
> > IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; INSERT INTO T3 VALUES
> > (@VAL1); END CATCH END; GO
> > 
> > -- permier test réussi : EXECUTE P_INSERT_TRANSACTION 1; GO
> > 
> > -- resultats : SELECT * FROM T1; SELECT * FROM T2; SELECT * FROM 
> > T3;
> > 
> > C1 ----------- 1
> > 
> > C2 ----------- 1
> > 
> > C3 -----------
> > 
> > -- second test échec : EXECUTE P_INSERT_TRANSACTION -1 GO
> > 
> > -- resultats : SELECT * FROM T1; SELECT * FROM T2; SELECT * FROM 
> > T3;
> > 
> > 
> > C1 -----------
> > 
> > C2 -----------
> > 
> > C3 ----------- -1
> > 
> > La procédure insère dans les tables T1 et T2 dans la cadre d'une 
> > transaction et, en cas de viol de la contrainte CHECK, annule la 
> > transaction et insère dans la table T3...
> 
> Pour ce point précis, il me semble que la procédure suivante remplit
> le même office, à moins que je n'aie raté un point ?
> 

Non, ça me paraît la même chose. En tout cas, PostgreSQL a 100% de
réussite sur le jeu de test fourni (testé sur une 8.4).

> create or replace function p_insert_transaction(val1 integer) returns
> void as $$
> BEGIN
>   BEGIN
>     insert into t2 values (val1);
>     insert into t1 values (val1);
>   EXCEPTION WHEN INTEGRITY_CONSTRAINT_VIOLATION THEN
>     insert into t3 values(val1);
>   END;
> END;
> $$ language 'plpgsql';
> 
> La documentation précise que lorsqu'une erreur survient dans un tel
> bloc, toute modification de l'état de la base de donnée est annulée.
> 

Oui. Et grâce à l'exception, il est possible de continuer la procédure
stockée.


-- 
Guillaume
http://blog.guillaume.lelarge.info
http://www.dalibo.com
PostgreSQL Sessions #3: http://www.postgresql-sessions.org


In response to

pgsql-fr-generale by date

Next:From: Dimitri FontaineDate: 2012-01-05 10:08:53
Subject: Re: Migration SQL Serveur 2008 vers PostgreSQL
Previous:From: Dimitri FontaineDate: 2012-01-05 10:00:43
Subject: Re: Migration SQL Serveur 2008 vers PostgreSQL

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group