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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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/
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/
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/
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 ***********************
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 ***********************
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 ***********************