2016-06-16 110 views
0

我不能得到什麼應該是一個簡單的觸發器工作。 它在INSERT之後觸發,測試列A是否爲空,如果是,則將其設置爲同一行上列B的值。 插入後,我檢查插入的行,列B有一個值,但列A爲空。 觸發器已啓用且正在觸發,因爲在絕望中,我在各個點將值記錄到工作表中,這些值是預期的。我在做什麼這個SQL Server 2012觸發器錯了?

我甚至試圖通過進入本表的Design併爲此列指定「默認值」1000來嘗試暫時繞過此問題,但它仍然爲空。 而我試着改變觸發器來設置列A的固定值爲987,但它仍然爲空。

是否有一些我不知道的插入物的特質?任何建議表示讚賞。

背景--------------------------------------------- --------------------------------

選項是一個表,其中存儲「選項」,其中一個與會者在一我們的活動可以註冊(例如,活動門票,可選的牛排或雞肉晚餐等) 這些選項是在定義活動時插入的(日期,場地,聯繫信息以及與會者可以選擇的選項爲.....註冊)。

的選項表:

OptionID INT (Identity, primary key) 
... 
MaxAttendees INT 
... 
AvlbRemainingRegQty INT 

這最後一列是沒有得到設置列 - 它應該是一個運行總數許多雞晚餐如何尚待出售

的我以爲我是瘋狂和/或做一些愚蠢的事情,所以我創建了一個zTestTrigger表來存儲INSERTED行中的值並驗證觸發器是否達到了某些點。

WhichPartOfTest VARCHAR(100) 
OptionID  INT 
AvlbRemRegQty INT 
MaxAttendees INT 

- 詳細---------------------------------------- -----------

USE [dbname] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[trig_Options_AvlbRemainingRegQty] 
ON [dbo].[Options] 
AFTER INSERT 
AS 
SET NOCOUNT ON 

DECLARE @I_OptionID INT 
DECLARE @I_AvlbRemainingRegQty INT 
DECLARE @I_MaxAttendees INT 

SELECT 
    @I_OptionID   = I.OptionID, 
    @I_AvlbRemainingRegQty = ISNULL(I.AvlbRemainingRegQty,-1), 
    @I_MaxAttendees  = MaxAttendees 
FROM Inserted I 

insert into zTestTrigger values ('Start of new test - values from INSERTED row are:',@I_OptionID, @I_AvlbRemainingRegQty, @I_MaxAttendees) 

IF ISNULL(@I_AvlbRemainingRegQty,-1) = -1 --(I had also tried checking IF I_AvlbRemainingRegQty IS NULL) 

    begin 

    insert into zTestTrigger values ('About to update table, setting AvlbRemQty = ' + cast(@I_MaxAttendees as varchar) + ' where id = ' + cast(@I_OptionID as varchar), 
@I_OptionID, @I_AvlbRemainingRegQty, @I_MaxAttendees) 

    UPDATE Options SET AvlbRemainingRegQty = @I_MaxAttendees WHERE OptionID = @I_OptionID 

    --Originally, I tried this: 
    --UPDATE OPTIONS SET AvlbRemainingRegQty = ISNULL(MaxAttendees,1000) WHERE OptionID = @I_OptionID 
    --This doesn't work either: 
    --UPDATE OPTIONS SET SET AvlbRemainingRegQty = SELECT ISNULL(MaxAttendees,1000) FROM Options WHERE OptionID = @I_OptionID) WHERE OptionID = @I_OptionID 
    --I even tried: 
    --UPDATE OPTIONS SET AvlbRemainingRegQty = 987 WHERE OptionID = @I_OptionID 

    declare @error int 
    set @error = @@ERROR 
    insert into zTestTrigger values ('@@ERROR is ' + cast(@error as varchar), 0,0,0) --Shows that @Error is 0 

    end 

從zTestTrigger表中選擇顯示

"About to update table, setting AvlbRemQty = 1000 where id = 491" , 491, -1, and 1000 

,我可以用ID 491選擇該行,但其AVLB雷姆數量爲空。

回答

1

我會親自使用instead of觸發器,因爲它允許我們從一開始就正確地放入數據。

但現在,我們要做的觸發後:

ALTER TRIGGER [dbo].[trig_Options_AvlbRemainingRegQty] 
ON [dbo].[Options] 
AFTER INSERT 
AS 
    SET NOCOUNT ON 

    UPDATE Options 
    SET 
     AvlbRemainingRegQty = COALESCE(AvlbRemainingRegQty, MaxAttendees) 
    WHERE 
     OptionID in (select OptionID from inserted) 

並注意觸發(不像你)承認inserted可以包含0個,1個或多個。所以把它作爲作爲一個表格,而不是從哪個單獨的,標量變量可以分配有意義的值。

就好像另一點:

它應該是一個運行總計許多雞晚餐如何尚待出售

總的來說,這是一個壞主意。如果您要單獨存儲每筆銷售的詳細信息,則剩餘的數字爲,計算結果爲。你所做的全部是存儲這樣的值給你自己一個存儲值爲與其餘數據不一致的的機會。

+0

感謝您的建議......但INSTEAD OF觸發器同樣無效。

asdf –

+0

確認後,花了5分鐘做出迴應,所以失去了編輯的評論。你的建議代碼顯然可以工作,但col仍然沒有更新。 INSTEAD OF觸發器引發了一個錯誤,我將在下一步看看。我只是有些放肆 - 一些基本的東西是錯誤的。順便說一句,我同意你的第二點,但我這樣做的人是我們小店裏的老大,並不在乎數據正常化。 –

相關問題