OVH Cloud OVH Cloud

trigger

4 réponses
Avatar
Hamet
Bonjour
je souhaiterai savoir si un trigger se déclenche que pour un enregistrement
à la fois. C'est veut dire qu'il y a qu'une ligne dans la table Inserted. Car
j'ai vu un trigger qui fait un cursor avec les enregistrements de la table
inserted. Pouvez vous me dire si cela sert à quelque chose de boucler autour
des enregistrement de cette table. Ci-dessous le trigger :


ON [dbo].[CONTRATS]
FOR UPDATE
AS



DECLARE CONTRATS_Insert_CRM_EMONET_TO_DST CURSOR FOR
SELECT DISTINCT idcontrat, crm_iddevis FROM inserted;
OPEN CONTRATS_Insert_CRM_EMONET_TO_DST;
FETCH NEXT FROM CONTRATS_Insert_CRM_EMONET_TO_DST INTO @idcontrat, @iddst;


begin
WHILE @@FETCH_STATUS = 0
BEGIN

-- Appel de la procédure
EXEC dbo.Trig_CRM_EMonet_To_Dst_Ajout @ced_name_table_emonet,
@idcontrat, @iddst, @ced_niv_priorite;

-- Petit update sur CONTRATS_CLIENTS_LIVRES afin de communiquer les
Destinataires
update contrats_clients_livres set idcontrat = idcontrat where idcontrat
= @idcontrat;

FETCH NEXT FROM CONTRATS_Insert_CRM_EMONET_TO_DST INTO @idcontrat, @iddst;

END
end
CLOSE CONTRATS_Insert_CRM_EMONET_TO_DST;
DEALLOCATE CONTRATS_Insert_CRM_EMONET_TO_DST;

4 réponses

Avatar
TedIF
Hamet a couché sur son écran :
Bonjour
je souhaiterai savoir si un trigger se déclenche que pour un enregistrement
à la fois. C'est veut dire qu'il y a qu'une ligne dans la table Inserted. Car
j'ai vu un trigger qui fait un cursor avec les enregistrements de la table
inserted. Pouvez vous me dire si cela sert à quelque chose de boucler autour
des enregistrement de cette table. Ci-dessous le trigger :




un trigger se déclenche aussi sur des traitements par lots. La table
INSERTEd et DELETED peuvent donc contenir plusieurs enregistrements. A
ne pas oublier !

--

Dominique
Avatar
Hamet
Merci
Mais-peux-tu me donner plus de précision ?
Pour moi le trigger se déclenche à chaque fois qu'il y a un ubdate, delete
ou insert. Si on fait un lot d'inserted, il se déclenchera autant de fois
qu'il y a d'insert dans le lot. Ce n'est pas cela ?

"TedIF" a écrit :

Hamet a couché sur son écran :
> Bonjour
> je souhaiterai savoir si un trigger se déclenche que pour un enregistrement
> à la fois. C'est veut dire qu'il y a qu'une ligne dans la table Inserted. Car
> j'ai vu un trigger qui fait un cursor avec les enregistrements de la table
> inserted. Pouvez vous me dire si cela sert à quelque chose de boucler autour
> des enregistrement de cette table. Ci-dessous le trigger :
>

un trigger se déclenche aussi sur des traitements par lots. La table
INSERTEd et DELETED peuvent donc contenir plusieurs enregistrements. A
ne pas oublier !

--

Dominique





Avatar
jeje
Bonjour,

"Hamet" a écrit dans le message de
news:
Merci
Mais-peux-tu me donner plus de précision ?
Pour moi le trigger se déclenche à chaque fois qu'il y a un ubdate,
delete
ou insert. Si on fait un lot d'inserted, il se déclenchera autant de
fois
qu'il y a d'insert dans le lot. Ce n'est pas cela ?



Si vous faites 3 mises à jour par 3 instructions successives, alors le
trigger se déclenchera 3 fois.
Si vous faites 1 mise à jour avec une instruction qui met à jour 3
lignes d'un coup par exemple, alors le trigger ne se déclenchera qu'une
seule fois et les tables inserted et deleted contiendront 3 lignes.

Exemple :

On envoie l'instruction :
UPDATE MaTable
SET MaColonne = 'toto'
where MaColonneClePrimaire = 1

Le trigger va se déclencher une fois et les tables inserted et deleted
ne contiendront qu'une ligne : celle qui est mise à jour.

Maintenant, on envoie l'instruction :
UPDATE MaTable
SET MaColonne = 'toto'
where MaColonneClePrimaire = 1 or MaColonneClePrimaire = 2 or
MaColonneClePrimaire = 3

Le trigger va se déclencher qu'une seule fois toujours, mais cette fois
les tables inserted et deleted contiendront 3 lignes : celles
correspondant aux valeurs de clé primaire 1, 2 et 3.
--
Jérôme
Avatar
Fred BROUARD
Hamet a écrit :
Merci
Mais-peux-tu me donner plus de précision ?
Pour moi le trigger se déclenche à chaque fois qu'il y a un ubdate, delete
ou insert. Si on fait un lot d'inserted, il se déclenchera autant de fois
qu'il y a d'insert dans le lot. Ce n'est pas cela ?



NON, NON et NON !

Le trigger se déclenche une seule fois, suite à l'ordre SQL visé quelque
soit le nombre de ligne de 0 à 3 millions.

votre code doit donc être si possible et surtout éviter :
1) les variables locales
2) les curseurs...

N'oubliez pas que dans le trigger vous êtes au sein de la transaction
qui n'est pas encore terminée. Tout le code que vous y mettrez
rallongera donc d'autant la durée de le transaction....

En l'occurrence remplacez votre appel de proc stock dans le curseur par
quelque chose comme :

CREATE TRIGGER ...
ON [dbo].[CONTRATS]
FOR UPDATE
AS

INSERT INTO maTable
SELECT DISTINCT idcontrat, crm_iddevis ...
FROM inserted
WHERE ....

update contrats_clients_livres
set idcontrat = idcontrat
FROM inserted
where ...

A +



"TedIF" a écrit :

Hamet a couché sur son écran :
Bonjour
je souhaiterai savoir si un trigger se déclenche que pour un enregistrement
à la fois. C'est veut dire qu'il y a qu'une ligne dans la table Inserted. Car
j'ai vu un trigger qui fait un cursor avec les enregistrements de la table
inserted. Pouvez vous me dire si cela sert à quelque chose de boucler autour
des enregistrement de cette table. Ci-dessous le trigger :



un trigger se déclenche aussi sur des traitements par lots. La table
INSERTEd et DELETED peuvent donc contenir plusieurs enregistrements. A
ne pas oublier !

--

Dominique









--
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 ***********************