我不能得到什麼應該是一個簡單的觸發器工作。 它在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雷姆數量爲空。
感謝您的建議......但INSTEAD OF觸發器同樣無效。
asdf –
確認後,花了5分鐘做出迴應,所以失去了編輯的評論。你的建議代碼顯然可以工作,但col仍然沒有更新。 INSTEAD OF觸發器引發了一個錯誤,我將在下一步看看。我只是有些放肆 - 一些基本的東西是錯誤的。順便說一句,我同意你的第二點,但我這樣做的人是我們小店裏的老大,並不在乎數據正常化。 –