2011-11-04 251 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