Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Essais successifs de mise à jour dans un trigger

2 réponses
Avatar
ftrl
Bonjour,

J'ai un trigger qui doit faire une mise à jour d'une table pouvant être
utilisée ailleurs (notamment par d'autre triggers faisant des mises à jour).
Bien sûr, la mise à jour doit être complete.

Le trigger peut donc se trouver bloqué dans la transaction principale de
mise à jour.

Est-ce qu'il est envisageable de faire ça (en gros) :

-- corps du trigger
begin
SELECT @compteurEssais=5 -- par exemple

while @compteurEssais>0
begin
begin transaction
UPDATE autresTables ...
IF @@error<>0
goto suivant
UPDATE autresTables ...
IF @@error<>0
goto suivant
...etc...

-- la mise à jour est complète, on commite et on quitte
commit transaction
break

suivant:
-- gestion de l'erreur de mise à jour
rollback transaction
SELECT @compteurEssais=@compteurEssais-1
IF @compteurEssais<1
raiserror "Erreur de mise à jour", 16, 1
end -- while
end -- begin


Quelle est la meilleure solution pour ce genre de problème : plusieurs
essais avant de générer une erreur.

Merci.

Jean

2 réponses

Avatar
Rudi Bruchez
ftrl a écrit:

J'ai un trigger qui doit faire une mise à jour d'une table pouvant être
utilisée ailleurs (notamment par d'autre triggers faisant des mises à jour).
Bien sûr, la mise à jour doit être complete.



Je ne suis pas sûr d'avoir compris la question. Quel est réellement le
problème ? Si vos enregistrements sont verrouillés, le trigger va attendre
la libération des verrous pour s'exécuter.
Essayez d'éviter de multiplier les triggers, pour votre mieux-être ;)

--
Rudi Bruchez
Consultant indépendant
modélisation, administration, optimisation,
Solutions MS SQL Server et informatique libre.
MCDBA, MCT, SCJP2
http://www.babaluga.com/
http://rudi.developpez.com/
Avatar
Fred BROUARD
bonjour,

ftrl a écrit :
Bonjour,

J'ai un trigger qui doit faire une mise à jour d'une table pouvant être
utilisée ailleurs (notamment par d'autre triggers faisant des mises à
jour).
Bien sûr, la mise à jour doit être complete.

Le trigger peut donc se trouver bloqué dans la transaction principale de
mise à jour.

Est-ce qu'il est envisageable de faire ça (en gros) :

-- corps du trigger
begin
SELECT @compteurEssais=5 -- par exemple

while @compteurEssais>0
begin
begin transaction
UPDATE autresTables ...
IF @@error<>0
goto suivant
UPDATE autresTables ...
IF @@error<>0
goto suivant
...etc...

-- la mise à jour est complète, on commite et on quitte
commit transaction
break

suivant:
-- gestion de l'erreur de mise à jour
rollback transaction
SELECT @compteurEssais=@compteurEssais-1
IF @compteurEssais<1
raiserror "Erreur de mise à jour", 16, 1
end -- while
end -- begin




Ce que vous avez écrit est un code plus que casse gueule... En effet la
notion de transaction imbriquée est assez subtile dans le sens ou il
n'existe pas de symétrie entre l'achèvement de la transaction par COMMIT
ou par ROLLBACK

En effet c'est le premier ROLLBACK qui termine la transaction. En
revanche, c'est le dernier COMMIT qui l'achève.

Exprimez donc plus calirement votre problématique fonctionnelle car je
suis sûr qu'il existe d'autres moyens pour parvenir à vos fins.

A +


Quelle est la meilleure solution pour ce genre de problème : plusieurs
essais avant de générer une erreur.

Merci.

Jean




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************