2015-01-27 7 views
1

Я новичок в триггерах SQL Server. Недавно я столкнулся с проблемой, что у меня есть две таблицы с именем tbl_Item и tbl_changePrice. Я хочу обновить tbl_Item, когда tbl_changeprice вставлен в новую строку. С этим новым именем строки данные о такой же дате будут обновляться в таблице tbl_item.Как запускать триггер после каждой вставки таблицы sql server автоматически?

Вот мой триггер, что испытывается мной для обновления таблицы:

Alter TRIGGER trgAfterInsert ON [dbo].[tbl_changePrice] 
After insert 
AS 
    declare @itemname int; 
    declare @saleprice decimal(18,2); 
    declare @buyprice decimal(18,2); 

    select @itemname=i.name from inserted i;  
    select @saleprice=i.saleprice from inserted i; 
    select @buyprice=i.pprice from inserted i; 

    update tbl_Item set sellingPrice= @saleprice, buyingPrice= @buyprice where name= @itemname 

    PRINT 'AFTER INSERT trigger fired.' 
GO 
+4

Ваш триггер ** MAJOR ** недостаток в том, что вы, кажется, предположить, что это будет называться ** один раз в строке ** - это ** не ** случай. Триггер будет срабатывать ** один раз за оператор **, поэтому, если ваши утверждения 'UPDATE' влияют на 25 строк, вы будете запускать триггер ** сразу **, но тогда' Inserted' и 'Deleted' будут содержать 25 строк , Какой из этих 25 строк будет выбран ваш код? 'select @ itemname = i.name из вставленного i;' - он не детерминирован. Для этого нужно переписать триггер! –

ответ

5

Для обработки несколько строк вставляется сразу - вы должны переписать триггер, чтобы быть в состоянии иметь дело с кратному строки в Inserted - что-то вроде этого:

ALTER TRIGGER trgAfterInsert 
ON [dbo].[tbl_changePrice] 
AFTER INSERT 
AS 
    UPDATE dbo.tbl_Item 
    SET sellingPrice = i.saleprice, buyingPrice = i.pprice 
    FROM Inserted i 
    WHERE tbl_Item.name = i.name 

    PRINT 'AFTER INSERT trigger fired.' 
GO 
Смежные вопросы