Wyzwalacz wstawiania jest wywoływany raz w przypadku wstawiania zbiorczego, ale w wyzwalaczu można użyć specjalnego inserted
tabela, aby uzyskać wszystkie wstawione wiersze.
Wyobraź sobie więc, że masz wyzwalacz wstawiania, taki jak ten, który rejestruje wszystkie wiersze wstawione do table
create trigger trgInsertTable
on dbo.table
for insert
as
insert tableLog(name)
select name from inserted
Za pomocą tego wyzwalacza podczas zbiorczego wstawiania w table
, tableLog
jest wypełniona taką samą liczbą wierszy, jaka została wstawiona do table
Dla konkretnego wyzwalacza, ponieważ musisz wywołać procedurę składowaną dla każdego wiersza, musisz użyć kursora:
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
Nie testowałem, ale powinienem działać