sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag få en utlösare att aktiveras på varje infogat rad under en INSERT INTO Table (etc) SELECT * FROM Table2?

Inserttriggern anropas en gång för bulkinserts, men på triggern kan du använda den speciella inserted tabell för att få alla infogade rader.

Så tänk dig att du har en infogningstrigger som den här, som loggar alla rader som infogats i table

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

Med denna utlösare, när du gör en massinsättning på table , tableLog är fylld med samma antal rader som infogades i table

För din specifika trigger, eftersom du behöver anropa en lagrad procedur för varje rad, måste du använda en markör:

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

Jag testade inte, men borde fungera



  1. Öka prestanda med Bulk Collect i Oracle

  2. Hur väljer man inre kopplingsfält med IF/case?

  3. Hur gör man två frågor med vanliga kolumner (A, B) och (A, C) till bara en (A, B, C)?

  4. Hur får man senast infognings-id i Oracle med MyBatis?