Il trigger di inserimento viene chiamato una volta per gli inserimenti in blocco, ma sul trigger è possibile utilizzare lo speciale inserted
tabella per ottenere tutte le righe inserite.
Quindi, immagina di avere un trigger di inserimento come questo, che registra tutte le righe inserite in table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Con questo trigger, quando esegui un inserimento collettivo su table
, il tableLog
viene riempito con lo stesso numero di righe che sono state inserite in table
Per il tuo trigger specifico, poiché devi chiamare una stored procedure per ogni riga, devi utilizzare un cursore:
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
Non ho provato, ma dovrebbe funzionare