Mise à jour avec un trigger

Le
Patrick
Bonjour,

J'aimerais mettre un trigger sur une table pour mettre à jour un champ après
un "INSERT". Pour le moment, je l'ai écrit comme cela :

CREATE TRIGGER [LW_TRANS_UPDATE_HZKEY] ON [dbo].[LW_TRANS]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

UPDATE LW_TRANS
SET HZKEY = (SELECT HZ_ACUDEF.HZKEY
FROM HZ_ACUDEF
WHERE HZ_ACUDEF.ACUKEY = LEFT(LW_TRANS.LAWSONKEY, 14))
WHERE LW_TRANS.HZKEY IS NULL
END

Comme on le voit, la mise à jour se fait avec la condition où le champ HZKEY
est NULL pour n'importe quel enregistrement de la table.
Est-il possible d'indiquer au trigger de mettre à jour seulement
l'enregistrement qui vient d'être ajouté ? Cela évitera le "WHERE" qui en
fait, à chaque fois, vérifie toute la table, ce qui est inutile puisque les
autres enregistrements sont déjà renseignés.

Merci.

--
Patrick
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Rudi Bruchez
Le #11865301
Bonjour,

Patrick a écrit:

Est-il possible d'indiquer au trigger de mettre à jour seulement
l'enregistrement qui vient d'être ajouté ? Cela évitera le "WHERE" qui en
fait, à chaque fois, vérifie toute la table, ce qui est inutile puisque les
autres enregistrements sont déjà renseignés.




En préambule, pour me faire plaisir (la plupart du temps, je me
retiens), dans un SGBDR comme SQL Server, il n'y a pas de champ, il n'y
a pas d'enregistrement. Ce sont des lignes et des colonnes.

Ça fait du bien ;)

Ensuite : oui, bien sûr !
Il y a dans un trigger deux pseudo-tables, nommées inserted et deleted,
qui ont la même structure que la table sur lequel le trigger est posé,
et qui contiennent seulement les lignes affectées (soit ajoutées, soit
supprimées). Donc, pour ta question :

UPDATE lt
SET HZKEY = (SELECT HZ_ACUDEF.HZKEY
FROM HZ_ACUDEF
WHERE HZ_ACUDEF.ACUKEY = LEFT(LW_TRANS.LAWSONKEY, 14))
FROM LW_TRANS lt
JOIN inserted i ON lt.ta_clé_primaire = i.ta_clé_primaire


--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/
Patrick
Le #11865291
Merci beaucoup.

--
Patrick


"Rudi Bruchez" wrote:

Bonjour,

Patrick a écrit:

> Est-il possible d'indiquer au trigger de mettre à jour seulement
> l'enregistrement qui vient d'être ajouté ? Cela évitera le "WHERE" qui en
> fait, à chaque fois, vérifie toute la table, ce qui est inutile puisque les
> autres enregistrements sont déjà renseignés.
>

En préambule, pour me faire plaisir (la plupart du temps, je me
retiens), dans un SGBDR comme SQL Server, il n'y a pas de champ, il n'y
a pas d'enregistrement. Ce sont des lignes et des colonnes.

Ça fait du bien ;)

Ensuite : oui, bien sûr !
Il y a dans un trigger deux pseudo-tables, nommées inserted et deleted,
qui ont la même structure que la table sur lequel le trigger est posé,
et qui contiennent seulement les lignes affectées (soit ajoutées, soit
supprimées). Donc, pour ta question :

UPDATE lt
SET HZKEY = (SELECT HZ_ACUDEF.HZKEY
FROM HZ_ACUDEF
WHERE HZ_ACUDEF.ACUKEY = LEFT(LW_TRANS.LAWSONKEY, 14))
FROM LW_TRANS lt
JOIN inserted i ON lt.ta_clé_primaire = i.ta_clé_primaire


--
Rudi Bruchez
Consultant independant, MCDBA, MCITP, MCT
http://www.babaluga.com/
http://rudi.developpez.com/



Publicité
Poster une réponse
Anonyme