O acionador de inserção é chamado uma vez para inserções em massa, mas no acionador você pode usar o
inserted
especial table para obter todas as linhas inseridas. Então, imagine que você tenha um gatilho de inserção como este, que registra todas as linhas inseridas em
table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Com este acionador, quando você faz uma inserção em massa em
table
, o tableLog
é preenchido com o mesmo número de linhas que foram inseridas na table
Para seu gatilho específico, como você precisa chamar um procedimento armazenado para cada linha, você precisa usar um cursor:
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
Não testei, mas deve funcionar