我想创建更新和插入我的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
相反,我得到这个错误:
消息515,级别16,状态2,过程InStockTrigger,309线 无法将NULL值插入列 '产品名称',表“ModelFirst.SupplementStore.dbo .ProductSet';列不允许有空值。 INSERT失败。 该声明已被终止。
这是一个相当混乱的设计,国际海事组织(这是什么意思,如果有在'InventorySet',一个用于同'ProductId'多行帮助'数量'> 0,另一个'数量'<0) - 根据可用数据动态计算诸如“InStock”值之类的东西通常会更好,而不是依赖触发器来维护它。如果您总是依赖'InventorySet'中的* actual *数据,那么您永远不会错误/不一致。只有当这暴露出性能问题时,我才会考虑引入这个指标(但是我想看看它是否可以在没有触发器的情况下实现) –