sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo hacer que un disparador se active en cada fila insertada durante una INSERCIÓN EN la tabla (etc.) SELECCIONAR * DE la Tabla2?

El disparador de inserción se llama una vez para inserciones masivas, pero en el disparador puede usar el inserted especial tabla para obtener todas las filas insertadas.

Entonces, imagine que tiene un disparador de inserción como este, que registra todas las filas insertadas en table

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

Con este activador, cuando realiza una inserción masiva en table , el tableLog se llena con el mismo número de filas que se insertaron en table

Para su disparador específico, dado que necesita llamar a un procedimiento almacenado para cada fila, necesita usar un 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

No probé, pero debería funcionar