Inserttriggern anropas en gång för bulkinserts, men på triggern kan du använda den speciella inserted
tabell för att få alla infogade rader.
Så tänk dig att du har en infogningstrigger som den här, som loggar alla rader som infogats i table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Med denna utlösare, när du gör en massinsättning på table
, tableLog
är fylld med samma antal rader som infogades i table
För din specifika trigger, eftersom du behöver anropa en lagrad procedur för varje rad, måste du använda en markör:
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
Jag testade inte, men borde fungera