OVH Cloud OVH Cloud

réalisation de transaction

4 réponses
Avatar
Richard
Bonjour.

j'ai réalisé grace à votre aide 2 requêtes ( insertion de lignes dans une
table de sauvegarde et destruction des lignes copiées dans la table
d'origine ).

Dans ma demande d'aide pour réalisation de ces requétes il est dit de gerer
une transaction pour étre sur d'avoir un résultat cohérent à la fin du proces.

OK pour ça, j'ai donc regardé le sujet sur "devellopez. com" et comme je ne
connais rien au sujet , je n'arrive pas à comprendre la démarche et comment
réaliser ce code.

Donc encore une fois je fais appel à vous pour contruire et m'expliquer les
manip. à suivre.
Le but final et de faire un ensemble des requêtes pour 20 tables que je
souhaite archiver

Voici un bout de la requête que je souhaite intéger à une transaction

/*----------------------------------------------------------------
Copier les données de la table ‘MOUVMNT’ dans ‘ARCH_MOUVEMNT’

Création d’alias pour éviter d'écrire le nom des tables en entier.

A pour Dbo.MATERIEL
B pour Dbo.MOUVEMNT


Filtres pour les critères suivants

SITE = EXT et FIN
BATIMENT <> EN ATTENTE et A GERER
DATE_INVENTAIRE <> ce jour moins 365 jours
> -----------------------------------------------------------------*/

insert into E_ARCH_MOUVEMNT
select *
From MOUVEMNT
where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
from MATERIEL a LEFT OUTER JOIN
MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
365,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

Merci de votre aide.

4 réponses

Avatar
jgabillaud
Bonjour,
Par d'afaut pour SQL Server chaque instruction représente une transaction.
Pour gérer plus finement une transaction, il faut la démarrer de manière
explicite par BEGIN TRAN
Puis la terminer en succès par COMMIT TRAN
Après chaque insertion il est possible de tester la présence ou non d'une
erreur(if @@error<>0) et d'annuler la TOTALITE de la transaction par
ROLLBACK TRAN
Bon courage

"Richard" a écrit :

Bonjour.

j'ai réalisé grace à votre aide 2 requêtes ( insertion de lignes dans une
table de sauvegarde et destruction des lignes copiées dans la table
d'origine ).

Dans ma demande d'aide pour réalisation de ces requétes il est dit de gerer
une transaction pour étre sur d'avoir un résultat cohérent à la fin du proces.

OK pour ça, j'ai donc regardé le sujet sur "devellopez. com" et comme je ne
connais rien au sujet , je n'arrive pas à comprendre la démarche et comment
réaliser ce code.

Donc encore une fois je fais appel à vous pour contruire et m'expliquer les
manip. à suivre.
Le but final et de faire un ensemble des requêtes pour 20 tables que je
souhaite archiver

Voici un bout de la requête que je souhaite intéger à une transaction

/*----------------------------------------------------------------
Copier les données de la table ‘MOUVMNT’ dans ‘ARCH_MOUVEMNT’

Création d’alias pour éviter d'écrire le nom des tables en entier.

A pour Dbo.MATERIEL
B pour Dbo.MOUVEMNT


Filtres pour les critères suivants

SITE = EXT et FIN
BATIMENT <> EN ATTENTE et A GERER
DATE_INVENTAIRE <> ce jour moins 365 jours
> -----------------------------------------------------------------*/

insert into E_ARCH_MOUVEMNT
select *
From MOUVEMNT
where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
from MATERIEL a LEFT OUTER JOIN
MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
365,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

Merci de votre aide.




Avatar
Richard
Bonjour et merçi pour cette réponse. Parcontre j'ai besoin d'un complément
d'information.

J'ai intégré ce code à ma requête, de la maniére suivante et je n'ai pas de
message d'erreur.Cela semble fonctionner

Je suis surpris que cela fonctionne du premier coup.

Pouvez vous m'indiquer si la réquête est elle bien construite.

y a t il un moyen de créer une erreur pour valider que j'ai bien construit
cette requête.

L'ensemble BEGIN TRAN et COMMIT TRAN peut t'il englober l'ensemble de la
requêt ou est il préferable de travailler par bloque
exemple:

BEGIN TRAN "requêt insert" COMMIT TRAN et BEGIN TRAN "requête delete" COMMIT
TRAN


"jgabillaud" a écrit :

Bonjour,
Par d'afaut pour SQL Server chaque instruction représente une transaction.
Pour gérer plus finement une transaction, il faut la démarrer de manière
explicite par BEGIN TRAN
Puis la terminer en succès par COMMIT TRAN
Après chaque insertion il est possible de tester la présence ou non d'une
erreur(if @@error<>0) et d'annuler la TOTALITE de la transaction par
ROLLBACK TRAN
Bon courage

"Richard" a écrit :

> Bonjour.
>
> j'ai réalisé grace à votre aide 2 requêtes ( insertion de lignes dans une
> table de sauvegarde et destruction des lignes copiées dans la table
> d'origine ).
>
> Dans ma demande d'aide pour réalisation de ces requétes il est dit de gerer
> une transaction pour étre sur d'avoir un résultat cohérent à la fin du proces.
>
> OK pour ça, j'ai donc regardé le sujet sur "devellopez. com" et comme je ne
> connais rien au sujet , je n'arrive pas à comprendre la démarche et comment
> réaliser ce code.
>
> Donc encore une fois je fais appel à vous pour contruire et m'expliquer les
> manip. à suivre.
> Le but final et de faire un ensemble des requêtes pour 20 tables que je
> souhaite archiver
>
> Voici un bout de la requête que je souhaite intéger à une transaction
>
> /*----------------------------------------------------------------
> Copier les données de la table ‘MOUVMNT’ dans ‘ARCH_MOUVEMNT’
>
> Création d’alias pour éviter d'écrire le nom des tables en entier.
>
> A pour Dbo.MATERIEL
> B pour Dbo.MOUVEMNT
>
>
> Filtres pour les critères suivants
>
> SITE = EXT et FIN
> BATIMENT <> EN ATTENTE et A GERER
> DATE_INVENTAIRE <> ce jour moins 365 jours
> > -----------------------------------------------------------------*/
>
> insert into E_ARCH_MOUVEMNT
> select *
> From MOUVEMNT
> where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
> from MATERIEL a LEFT OUTER JOIN
> MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
> WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
> 365,CURRENT_TIMESTAMP)
> AND a.SITE IN ('EXT', 'FIN')
> and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))
>
> Merci de votre aide.
>
>


Avatar
Richard
Désolé j'avais oublier le code réalisé, le voici:

BEGIN TRAN

insert into E_ARCH_MOUVEMNT
select *
From MOUVEMNT
where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
from MATERIEL a LEFT OUTER JOIN
MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
365,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

if @@error<>0
ROLLBACK TRAN

COMMIT TRAN




Bonjour et merçi pour cette réponse. Parcontre j'ai besoin d'un complément
d'information.

J'ai intégré ce code à ma requête, de la maniére suivante et je n'ai pas de
message d'erreur.Cela semble fonctionner

Je suis surpris que cela fonctionne du premier coup.

Pouvez vous m'indiquer si la réquête est elle bien construite.

y a t il un moyen de créer une erreur pour valider que j'ai bien construit
cette requête.

L'ensemble BEGIN TRAN et COMMIT TRAN peut t'il englober l'ensemble de la
requêt ou est il préferable de travailler par bloque
exemple:

BEGIN TRAN "requêt insert" COMMIT TRAN et BEGIN TRAN "requête delete" COMMIT
TRAN



"jgabillaud" a écrit :

Bonjour,
Par d'afaut pour SQL Server chaque instruction représente une transaction.
Pour gérer plus finement une transaction, il faut la démarrer de manière
explicite par BEGIN TRAN
Puis la terminer en succès par COMMIT TRAN
Après chaque insertion il est possible de tester la présence ou non d'une
erreur(if @@error<>0) et d'annuler la TOTALITE de la transaction par
ROLLBACK TRAN
Bon courage

"Richard" a écrit :

> Bonjour.
>
> j'ai réalisé grace à votre aide 2 requêtes ( insertion de lignes dans une
> table de sauvegarde et destruction des lignes copiées dans la table
> d'origine ).
>
> Dans ma demande d'aide pour réalisation de ces requétes il est dit de gerer
> une transaction pour étre sur d'avoir un résultat cohérent à la fin du proces.
>
> OK pour ça, j'ai donc regardé le sujet sur "devellopez. com" et comme je ne
> connais rien au sujet , je n'arrive pas à comprendre la démarche et comment
> réaliser ce code.
>
> Donc encore une fois je fais appel à vous pour contruire et m'expliquer les
> manip. à suivre.
> Le but final et de faire un ensemble des requêtes pour 20 tables que je
> souhaite archiver
>
> Voici un bout de la requête que je souhaite intéger à une transaction
>
> /*----------------------------------------------------------------
> Copier les données de la table ‘MOUVMNT’ dans ‘ARCH_MOUVEMNT’
>
> Création d’alias pour éviter d'écrire le nom des tables en entier.
>
> A pour Dbo.MATERIEL
> B pour Dbo.MOUVEMNT
>
>
> Filtres pour les critères suivants
>
> SITE = EXT et FIN
> BATIMENT <> EN ATTENTE et A GERER
> DATE_INVENTAIRE <> ce jour moins 365 jours
> > -----------------------------------------------------------------*/
>
> insert into E_ARCH_MOUVEMNT
> select *
> From MOUVEMNT
> where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
> from MATERIEL a LEFT OUTER JOIN
> MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
> WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
> 365,CURRENT_TIMESTAMP)
> AND a.SITE IN ('EXT', 'FIN')
> and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))
>
> Merci de votre aide.
>
>


Avatar
Fred BROUARD
Richard a écrit:
Désolé j'avais oublier le code réalisé, le voici:

BEGIN TRAN

insert into E_ARCH_MOUVEMNT
select *
From MOUVEMNT
where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
from MATERIEL a LEFT OUTER JOIN
MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
365,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

if @@error<>0
ROLLBACK TRAN

COMMIT TRAN



En l'occurence cette transaction ne sert à rien puisqu'elle ne porte que sur une
requête.

Voici le code plus complet :

SET TRANSACTION LEVEL REPEATABLE READ
-- niveau d'isolation obligatoire si l'on veut que le jeu de ligne à insérer
-- soit le même que celui à détruire

BEGIN TRANSACTION

-- insertion dans E_ARCH_MOUVEMNT
INSERT INTO E_ARCH_MOUVEMNT
SELECT *
FROM MOUVEMNT
WHERE CLE_MATERIEL IN (SELECT a.CLE_MATERIEL
FROM MATERIEL a
LEFT OUTER JOIN MOUVEMNT b
ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <
DATEADD(year, -1,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
AND a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

IF @@ERRPR <> 0
GOTO ROLLBACK_ON_ERROR

-- supression dans MOUVEMNT
DELETE FROM MOUVEMNT
WHERE CLE_MATERIEL IN (SELECT a.CLE_MATERIEL
FROM MATERIEL a
LEFT OUTER JOIN MOUVEMNT b
ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <
DATEADD(year, -1,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
AND a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

IF @@ERRPR <> 0
GOTO ROLLBACK_ON_ERROR

-- il n'y a aps eût d'erreur => tout s'est bien passé; on valide la transaction
COMMIT TRANSACTION
-- et on sort de la procédure
RETURN

-- branchement d'étiquette en cas d'erreur
ROLLBACK_ON_ERROR:
-- et annulation
ROLLBACK TRANSACTION


Au passage quelques améliorations :
1) suppression du distinct inutile et couteux dans la sous requête
2) DATEADD(year, -1,CURRENT_TIMESTAMP) à la place de
DATEADD(days, -365, CURRENT_TIMESTAMP) qui permetra de gérer même les années
bisextiles.

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************




Bonjour et merçi pour cette réponse. Parcontre j'ai besoin d'un complément
d'information.

J'ai intégré ce code à ma requête, de la maniére suivante et je n'ai pas de
message d'erreur.Cela semble fonctionner

Je suis surpris que cela fonctionne du premier coup.

Pouvez vous m'indiquer si la réquête est elle bien construite.

y a t il un moyen de créer une erreur pour valider que j'ai bien construit
cette requête.

L'ensemble BEGIN TRAN et COMMIT TRAN peut t'il englober l'ensemble de la
requêt ou est il préferable de travailler par bloque
exemple:

BEGIN TRAN "requêt insert" COMMIT TRAN et BEGIN TRAN "requête delete" COMMIT
TRAN



"jgabillaud" a écrit :


Bonjour,
Par d'afaut pour SQL Server chaque instruction représente une transaction.
Pour gérer plus finement une transaction, il faut la démarrer de manière
explicite par BEGIN TRAN
Puis la terminer en succès par COMMIT TRAN
Après chaque insertion il est possible de tester la présence ou non d'une
erreur(if @@error<>0) et d'annuler la TOTALITE de la transaction par
ROLLBACK TRAN
Bon courage

"Richard" a écrit :


Bonjour.

j'ai réalisé grace à votre aide 2 requêtes ( insertion de lignes dans une
table de sauvegarde et destruction des lignes copiées dans la table
d'origine ).

Dans ma demande d'aide pour réalisation de ces requétes il est dit de gerer
une transaction pour étre sur d'avoir un résultat cohérent à la fin du proces.

OK pour ça, j'ai donc regardé le sujet sur "devellopez. com" et comme je ne
connais rien au sujet , je n'arrive pas à comprendre la démarche et comment
réaliser ce code.

Donc encore une fois je fais appel à vous pour contruire et m'expliquer les
manip. à suivre.
Le but final et de faire un ensemble des requêtes pour 20 tables que je
souhaite archiver

Voici un bout de la requête que je souhaite intéger à une transaction

/*----------------------------------------------------------------
Copier les données de la table ‘MOUVMNT’ dans ‘ARCH_MOUVEMNT’

Création d’alias pour éviter d'écrire le nom des tables en entier.

A pour Dbo.MATERIEL
B pour Dbo.MOUVEMNT


Filtres pour les critères suivants

SITE = EXT et FIN
BATIMENT <> EN ATTENTE et A GERER
DATE_INVENTAIRE <> ce jour moins 365 jours

-----------------------------------------------------------------*/



insert into E_ARCH_MOUVEMNT
select *
From MOUVEMNT
where CLE_MATERIEL in (select distinct a.CLE_MATERIEL
from MATERIEL a LEFT OUTER JOIN
MOUVEMNT b ON a.CLE_MATERIEL = a.CLE_MATERIEL
WHERE a.DATE_INVENTAIRE <DATEADD(Day, -
365,CURRENT_TIMESTAMP)
AND a.SITE IN ('EXT', 'FIN')
and a.BATIMENT NOT IN ('EN ATTENTE', 'A GERER'))

Merci de votre aide.