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

Mise à jour avec un trigger

2 réponses
Avatar
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

2 réponses

Avatar
Rudi Bruchez
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/
Avatar
Patrick
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/