我學習觸發對值進行比較檢查值(觸發很難笑)SQL Server 2008的觸發方式:在插入
我越來越麻煩,檢查ID應該是裏面的inserted
例如,假設我們有表testTb1
與數據行:
|id|section_id|current_num_student|max_num_student|
|1 |1 | 23 | 23 |
|2 |3 | 21 | 29 |
|3 |5 | 50 | 50 |
current_num_student
是學生在課堂上的數量和max_num_student
是班上最大。 max_num_student
將由教師定義,因此它可以是任何數字。
現在學生想要添加第5部分,但current_num_student
等於max_num_student
。因此,我們必須拒絕一名學生。
查詢在jsp文件是這樣..
update testTb1
SET current_num_student = current_num_student + 1
WHERE section_id = ?
「?」將由用戶在jsp中輸入數據。
因此,我試圖讓觸發如..
ALTER TRIGGER testTrg
on dbo.testTb1
AFTER UPDATE
AS
if EXISTS(select * FROM inserted FULL JOIN dbo.testTb1 m ON
m.section_id = inserted.section_id AND m.num_cur = m.num_max)
Begin
RAISERROR ('Can not update data because class is full', 16,1);
rollback tran
END
當我使用手動查詢先行先試,情況返回錯誤信息
UPDATE mydata.dbo.testTb1
SET num_cur = num_cur + 1
WHERE section_id = 1
我得到消息,如
Msg 50000,Level 16,State 1,Procedure testTrg,Line 9
由於類已滿而無法更新數據 消息3609,級別16,狀態1,行19 事務在觸發器中結束。該批次已被中止。
然而,當我試圖
UPDATE mydata.dbo.testTb1
SET num_cur = num_cur + 1
WHERE section_id =3
必須是沒有錯誤情況下(必須增加current_num_student
)
消息50000,級別16,狀態1,過程testTrg ,第9行
由於類已滿而無法更新數據
Msg 3609,Level 16,State 1,Line 1
交易在觸發器中結束。該批次已被中止。
因此,我猜inserted.section_id
不包含任何值。
但是,我不確定我的猜測是否正確。
如果我的觸發器語法錯誤,你能告訴我需要修復的部分嗎?
或
如果觸發語法是正確的,你能告訴我的方法來打印inserted.section
這是您對此的* *第三個問題 - 什麼是錯與以前的答案? – 2012-03-13 08:51:23