Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新、插入、删除库存时触发_Sql_Sql Server_Entity Framework - Fatal编程技术网

Sql 更新、插入、删除库存时触发

Sql 更新、插入、删除库存时触发,sql,sql-server,entity-framework,Sql,Sql Server,Entity Framework,我想创建一个触发器来更新和插入我的Inventoryset表 当数量更改且小于0时,我希望更改表ProductSet中的库存,如果数量大于0 我的尝试根本不起作用 -- Creating table 'ProductSet' CREATE TABLE [dbo].[ProductSet] ( [ProductId] int IDENTITY(1,1) NOT NULL, [ProductName] nvarchar(max) NOT NULL, [Description

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

当数量更改且小于0时,我希望更改表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”;列不允许空值。插入失败。
语句已终止。

插入、更新后使用的语句。After仅在insert运行后激发,而不是代替insert或delete激发,这样您就可以在需要时访问insert/delete表

你需要使用。我有一篇关于它的更好的博客文章

CREATE TRIGGER [dbo].[TestTrigger]
ON [dbo].[InventorySet]
INSTEAD INSERT, UPDATE
AS 
BEGIN
SET NOCOUNT ON;
--现在检查一下你是否有你想要的库存量,然后施展你的魔法。如果您发布您的
--我可以帮上忙

GO 

这是一个相当混乱的设计,IMO(如果在
InventorySet
中,同一
ProductId
有多行,一行有
数量,另一行有
数量,这意味着什么)-通常,最好根据当时可用的数据动态计算像这样的
InStock
值,而不是依赖触发器来维护它。如果您总是依赖于
清单集
中的实际数据,您永远不会出错/不一致。只有当这暴露出性能问题时,我才会考虑引入这个指示器(但我想看看它是否可以在没有触发器的情况下实现)。我试过了,看看我刚刚做的编辑。你能看出怎么了吗/您的模式表示无法在productset中插入空值。您需要发布您的模式,看起来您对SQL非常陌生,您需要将值插入到不可为null的列中