Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich einen Trigger erhalten, der auf jeder eingefügten Zeile während eines INSERT INTO Table (usw.) SELECT * FROM Table2 ausgelöst wird?

Der Insert-Trigger wird einmal für Masseneinfügungen aufgerufen, aber auf dem Trigger können Sie den speziellen inserted verwenden Tabelle, um alle eingefügten Zeilen zu erhalten.

Stellen Sie sich also vor, Sie haben einen Insert-Trigger wie diesen, der alle in table eingefügten Zeilen protokolliert

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

Mit diesem Trigger, wenn Sie eine Masseneinfügung in table vornehmen , das tableLog wird mit der gleichen Anzahl von Zeilen gefüllt, die in table eingefügt wurden

Da Sie für jede Zeile eine gespeicherte Prozedur aufrufen müssen, müssen Sie für Ihren spezifischen Trigger einen Cursor verwenden:

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

Ich habe es nicht getestet, sollte aber funktionieren