Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да накарам тригер да се задейства на всеки вмъкнат ред по време на INSERT INTO Table (и т.н.) SELECT * FROM Table2?

Тригерът за вмъкване се извиква веднъж за групови вмъквания, но на тригера можете да използвате специалния inserted таблица, за да получите всички вмъкнати редове.

И така, представете си, че имате тригер за вмъкване като този, който регистрира всички редове, вмъкнати в table

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

С този тригер, когато правите групово вмъкване в table , tableLog се запълва със същия брой редове, които са били вмъкнати в table

За вашия конкретен тригер, тъй като трябва да извикате съхранена процедура за всеки ред, трябва да използвате курсор:

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

Не съм тествал, но трябва да работи



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите отместване на часовата зона от името на часовата зона

  2. Конфигуриране на стартираща среда в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 7

  3. SQL Server използва висок процесор при търсене в nvarchar низове

  4. Има ли такова нещо като твърде много маси?

  5. Сортиране на куршуми в базата данни