Le déclencheur d'insertion est appelé une fois pour les insertions en bloc, mais sur le déclencheur, vous pouvez utiliser le spécial inserted
table pour obtenir toutes les lignes insérées.
Alors, imaginez que vous avez un déclencheur d'insertion comme celui-ci, qui enregistre toutes les lignes insérées dans table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Avec ce déclencheur, lorsque vous effectuez une insertion en masse sur table
, le tableLog
est rempli avec le même nombre de lignes qui ont été insérées dans table
Pour votre déclencheur spécifique, puisque vous devez appeler une procédure stockée pour chaque ligne, vous devez utiliser un curseur :
ALTER TRIGGER dbo.Notify
ON dbo.Table
AFTER INSERT
AS
BEGIN
DECLARE @EmailSender varchar(50)='Sender Profile'
DECLARE @User varchar(20)
DECLARE @Subject varchar(50)
DECLARE cursor CURSOR FOR
SELECT User, '(' + CONVERT(varchar, Id) + ')!'
FROM inserted
OPEN cursor
FETCH NEXT FROM cursor INTO @User, @Subject
WHILE @@FETCH_STATUS = 0
BEGIN
exec msdb.dbo.sp_send_dbmail
@[email protected],
@[email protected]
@[email protected],
@body='//etc'
FETCH NEXT FROM cursor INTO @User, @Subject
END
CLOSE cursor
DEALLOCATE cursor
END
Je n'ai pas testé, mais ça devrait marcher