Здравствуйте! Помогите разобраться с созданием триггеров MS SQL Server. Есть вот такое задание:
При добавлении нового товара триггер проверяет его на-
личие на складе, если такой товар есть и новые данные о
товаре совпадают с уже существующими данными, вместо
добавления происходит обновление информации о коли-
честве товара
Я попытался сделать таким образом, но это неправильно:
create trigger tg_check_product_availability on Goods
after insert as
begin
update Goods
set QuantityInStock=g.QuantityInStock+i.QuantityInStock
from Goods g join inserted i on g.Id=i.Id
where g.Name like i.Name and g.Kind like i.Kind and g.Brand like i.Brand
and g.CostPrice like i.CostPrice and g.Price like i.Price
end
Если я добавляю новую позицию, то все норм. А при добавлении существующей выскакивает:
Msg 2627, Level 14, State 1, Line 18
Violation of UNIQUE KEY constraint ‘UQ__Goods__BAB741D7FA60D5B9’. Cannot insert duplicate key in object ‘dbo.Goods’. The duplicate key value is (Nike).
В том то и дело, что, если я сделаю INSTEAD OF, то я не смогу добавить вообще ничего. А нужно всего лишь обновлять количество и нужен именно триггер. Как быть?
Я конечно извиняюсь за то что скажу своего мнения… Зачем здесь триггер если при выборе -SELECT-можно проверять “количество товара” и в общем “существование” этого товара. Вот на данный момент я не вижу преимущества использования триггеров…
CREATE TABLE MyTempTable (a int NOT NULL, b int NOT NULL)
CREATE TRIGGER InsteadOfInsertForMyTempTable on MyTempTable INSTEAD OF INSERT AS
BEGIN
UPDATE MyTempTable SET b = m.b + i.b
FROM MyTempTable m, Inserted i
WHERE m.a = i.a
INSERT INTO MyTempTable
SELECT i.a,i.b
FROM Inserted i LEFT JOIN MyTempTable m ON m.a=i.a
WHERE m.a IS NULL
END
INSERT INTO MyTempTable VALUES(1,10)
INSERT INTO MyTempTable VALUES(2,15)
SELECT * FROM MyTempTable
1 10
2 15
INSERT INTO MyTempTable VALUES(2,3)
INSERT INTO MyTempTable VALUES(3,4)
SELECT * FROM MyTempTable