|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 |
|
Messages: n/a
Hébergeur: |
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/ |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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/ > |
|
![]() |
| Outils de la discussion | |
|
|