Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso obter um gatilho para disparar em cada linha inserida durante um INSERT INTO Table (etc) SELECT * FROM Table2?


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