Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je faire en sorte qu'un déclencheur se déclenche sur chaque ligne insérée lors d'un INSERT INTO Table (etc) SELECT * FROM Table2?

Le déclencheur d'insertion est appelé une fois pour les insertions en bloc, mais sur le déclencheur, vous pouvez utiliser le spécial inserted table pour obtenir toutes les lignes insérées.

Alors, imaginez que vous avez un déclencheur d'insertion comme celui-ci, qui enregistre toutes les lignes insérées dans table

create trigger trgInsertTable 
on dbo.table
for insert
as
   insert tableLog(name)
    select name from inserted

Avec ce déclencheur, lorsque vous effectuez une insertion en masse sur table , le tableLog est rempli avec le même nombre de lignes qui ont été insérées dans table

Pour votre déclencheur spécifique, puisque vous devez appeler une procédure stockée pour chaque ligne, vous devez utiliser un curseur :

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

Je n'ai pas testé, mais ça devrait marcher