2011-11-04 249 views
1

快速问题,我正在构建一个简单的触发器,目的是减少一个名为openSeats的表字段的值,触发器在插入时执行,但我不知道用什么命令说: 减少值openSeats,其中ID是等于插入标识插入sql触发器

USE [Training] 
GO 
/****** Object: Trigger [dbo].[DecrementSeat] Script Date: 11/04/2011 14:55:17 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description: <Description,,> 
-- ============================================= 

ALTER TRIGGER [dbo].[DecrementSeat] 
    ON [dbo].[personTraining] 
    AFTER INSERT 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    UPDATE [dbo].[tbl_training] 
    SET openSeats = openSeats - 1 
    WHERE training_id = 

END

回答

0

尝试这在您的触发器:

update dbo.tbl_training 
set openSeats = openSeats - 1 
where training_id in 
(
    select training_id 
    from inserted 
) 

它利用inserted SQL Server在触发期间使用插入数据填充的动态表。

+0

“插入”列前缀不匹配查询中使用 – user959443

+0

由于表名或别名,得到它的工作,你可以给我推荐一个很好的教程或书触发器? – user959443

+0

这里有一篇很好的关于触发器的文章让你入门(http://msdn.microsoft.com/en-us/magazine/cc164047.aspx)。任何有关SQL Server的书籍都会有很好的信息。如果这解决了你的答案,请标记为答案。乐意效劳! – 2011-11-04 20:43:42

2

您的触发器应该能够处理“多行”插入。我希望你想从openSeats中为插入的每一行减1。

事情是这样的:

UPDATE [dbo].[tbl_training] 
    SET openSeats = openSeats - 
     (SELECT COUNT(1) FROM inserted 
      WHERE inserted.training_id = [dbo].[tbl_training].training_id) 
WHERE training_id IN 
     (SELECT inserted.training_id FROM inserted 
      WHERE inserted.training_id IS NOT NULL) 
+0

是的,正确的,我需要drecrement每行 – user959443

+0

谢谢这工作得很好! – user959443