2014-02-17 4 views
0

Я хочу создать триггер для обновления и вставки моей таблицы 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 терпит неудачу. Заявление было прекращено.

+1

Это довольно запутанную конструкцию, IMO (что это значит, если есть несколько строк для одной и той же '' ProductId' в InventorySet' и один имеет 'Quantity'> 0, а другой -' Quantity' <0) - обычно лучше вычислять такие вещи, как это значение «InStock», динамически на основе имеющихся тогда данных, а не полагаться на триггеры для его поддержания. Если вы всегда полагаетесь на * актуальные * данные в «InventorySet», вы никогда не ошибетесь/несовместимы. Только если это вызовет проблему с производительностью, я бы рассмотрел возможность введения этого показателя (но я бы посмотрел, можно ли его реализовать без триггеров). –

ответ

0

Вы используете после Insert, Update. После только пожаров после запуска вставки вместо пожаров вместо вставки или удаления, поэтому у вас есть доступ к столам Insert/Delete, если они вам нужны.

Вам необходимо использовать INSTEAD OF. Sql Server Authority имеет лучший пост в блоге об этом IMO

CREATE TRIGGER [dbo].[TestTrigger] 
ON [dbo].[InventorySet] 
INSTEAD INSERT, UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

- Проверим, если у вас есть количество Instock, что вы хотите, и делать свою магию. Если вы разместите
- схему таблицы я мог бы помочь с этим

GO 
+0

Я попробовал, посмотрю на мое редактирование, которое я только что сделал. Вы видите, что случилось? :/ – Cyrix

+0

В вашей схеме указано, что вы не можете вставить нулевое значение в набор продуктов. Вам нужно опубликовать свою схему, это выглядит как ваш довольно новый для SQL, вам нужно вставлять значения в столбцы, которые не являются нулевыми – gh9

Смежные вопросы