Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso ottenere un trigger da attivare su ogni riga inserita durante un INSERT INTO Table (ecc.) SELECT * FROM Table2?

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