更新,插入,删除库存时触发

时间:2014-02-17 12:02:29

标签: sql sql-server entity-framework

我想创建一个更新和插入Inventoryset表的触发器。

当数量改变且小于0时,我希望我的表ProductSet中的Instock被更改,如果数量大于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,Level 16,State 2,Procedure InStockTrigger,309行 无法将值NULL插入列'ProductName',表'ModelFirst.SupplementStore.dbo.ProductSet';列不允许空值。 INSERT失败。 声明已经终止。

1 个答案:

答案 0 :(得分:0)

您在插入,更新后使用。仅在插入运行后触发,而不是触发而不是插入或删除,因此您可以访问插入/删除表,如果您需要它们

您需要使用INSTEAD OFSql Server Authority有一篇关于它的更好的博客文章imo

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

- 现在检查一下,如果你有你想要的instock数量并且做你的魔法。如果你发布你的 - 表格架构我可以帮助解决这个问题

GO