Я хочу создать триггер для обновления и вставки моей таблицы Inventoryset.Триггер при обновлении, вставке, удалении инвентаря
Когда количество изменяется, и это меньше, чем 0, то я хочу Instock в моей таблице ProductSet быть изменена, и если количество больше чем 0.
Моя попытка не работает.
-- Creating table 'ProductSet'
CREATE TABLE [dbo].[ProductSet] (
[ProductId] int IDENTITY(1,1) NOT NULL,
[ProductName] nvarchar(max) NOT NULL,
[Description] nvarchar(max) NOT NULL,
[ImagePath] nvarchar(max) NOT NULL,
[UnitPrice] float NOT NULL,
[CategoryId] int NOT NULL,
[InStock] bit NOT NULL
);
GO
-- Creating table 'InventorySet'
CREATE TABLE [dbo].[InventorySet] (
[InventoryId] int IDENTITY(1,1) NOT NULL,
[Quantity] int NOT NULL,
[ProductId] int NOT NULL
);
GO
Я знаю, что это неправильно, но здесь вы идете. : P
CREATE TRIGGER [dbo].[TestTrigger]
ON [dbo].[InventorySet]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF (SELECT dbo.InventorySet.Quantity) > 0
THEN INSERT INTO dbo.ProductSet (InStock) VALUE (1)
ELSE
INSERT INTO dbo.ProductSet (InStock) VALUE (2)
END
GO
Это то, что я сейчас:
-- Initierar databasen
CREATE TRIGGER [dbo].[InStockTrigger]
ON [dbo].[InventorySet]
INSTEAD OF INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
Declare @Quantity BIT
SELECT @Quantity = dbo.InventorySet.Quantity FROM dbo.InventorySet
IF @Quantity > 0
BEGIN
INSERT INTO dbo.ProductSet (InStock) VALUES (1)
END
ELSE
INSERT INTO dbo.ProductSet (InStock) VALUES (2)
END
GO
Но когда я добавляю это, я хочу, чтобы обновить Instock (как я написал курок), но это не так.
SET IDENTITY_INSERT InventorySet ON
insert into InventorySet (InventoryId, Quantity, ProductId) values (1, 25, 1);
insert into InventorySet (InventoryId, Quantity, ProductId) values (2, 31, 2);
insert into InventorySet (InventoryId, Quantity, ProductId) values (3, 2, 3);
insert into InventorySet (InventoryId, Quantity, ProductId) values (4, 0, 4);
SET IDENTITY_INSERT InventorySet OFF
GO
Вместо этого я получаю эту ошибку:
Msg 515, уровень 16, состояние 2, процедура InStockTrigger, Линия 309 Не удается вставить значение NULL в столбец 'ProductName', таблица «ModelFirst.SupplementStore.dbo .ProductSet '; столбец не допускает нулей. INSERT терпит неудачу. Заявление было прекращено.
Это довольно запутанную конструкцию, IMO (что это значит, если есть несколько строк для одной и той же '' ProductId' в InventorySet' и один имеет 'Quantity'> 0, а другой -' Quantity' <0) - обычно лучше вычислять такие вещи, как это значение «InStock», динамически на основе имеющихся тогда данных, а не полагаться на триггеры для его поддержания. Если вы всегда полагаетесь на * актуальные * данные в «InventorySet», вы никогда не ошибетесь/несовместимы. Только если это вызовет проблему с производительностью, я бы рассмотрел возможность введения этого показателя (но я бы посмотрел, можно ли его реализовать без триггеров). –