Sql 更新、插入、删除库存时触发
我想创建一个触发器来更新和插入我的Inventoryset表 当数量更改且小于0时,我希望更改表ProductSet中的库存,如果数量大于0 我的尝试根本不起作用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
-- 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的列中