2014-02-17 47 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 

相反,我得到这个错误:

消息515,级别16,状态2,过程InStockTrigger,309线 无法将NULL值插入列 '产品名称',表“ModelFirst.SupplementStore.dbo .ProductSet';列不允许有空值。 INSERT失败。 该声明已被终止。

+1

这是一个相当混乱的设计,国际海事组织(这是什么意思,如果有在'InventorySet',一个用于同'ProductId'多行帮助'数量'> 0,另一个'数量'<0) - 根据可用数据动态计算诸如“InStock”值之类的东西通常会更好,而不是依赖触发器来维护它。如果您总是依赖'InventorySet'中的* actual *数据,那么您永远不会错误/不一致。只有当这暴露出性能问题时,我才会考虑引入这个指标(但是我想看看它是否可以在没有触发器的情况下实现) –

回答

0

您在插入,更新后使用。在插入运行后只触发,而不是插入或删除,因此您可以访问插入/删除表以满足您的需要

您需要使用INSTEAD OFSql Server Authority有一个更好的博客帖子大约是IMO

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

- 现在检查,如果你有你想要的数量的inStock,做你的魔术。如果您发布
- 表模式,我可以与

GO 
+0

我试过了,看看我刚刚做的编辑。你能看到有什么问题吗? :/ – Cyrix

+0

您的架构表示您无法在productset中插入空值。你需要发布你的模式,它看起来像你很新的SQL,你需要插入值不能为空的列 – gh9