sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu přimět spouštěč, aby se spustil na každém vloženém řádku během INSERT INTO Table (atd.) SELECT * FROM Table2?

Spouštěč vkládání se u hromadných vkládání volá jednou, ale na spouštěči můžete použít speciální inserted tabulky, abyste získali všechny vložené řádky.

Představte si tedy, že máte spouštěč vložení, jako je tento, který zaznamenává všechny řádky vložené do table

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

S tímto spouštěčem, když provedete hromadné vložení na table , tableLog je vyplněno stejným počtem řádků, jaké byly vloženy do table

Pro váš konkrétní trigger, protože potřebujete volat uloženou proceduru pro každý řádek, musíte použít kurzor:

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

Netestoval jsem, ale měl by fungovat



  1. Jak vrátit výstupní parametry oracle z uložené procedury v .NET

  2. Formátovat výsledky dotazu v SQL*Plus

  3. Zjistěte, zda hodnota obsahuje alespoň jednu číselnou číslici v PostgreSQL

  4. Identifikace struktury kusovníku (BOM) v databázích