2012-03-13 69 views
0

我學習觸發對值進行比較檢查值(觸發很難笑)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

+1

這是您對此的* *第三個問題 - 什麼是錯與以前的答案? – 2012-03-13 08:51:23

回答

0

你的第二個更新查詢的值是使用其他數據庫名稱,應該不會是mydata

UPDATE **cse132b**.dbo.testTb1 
    SET num_cur = num_cur + 1 
    WHERE section_id =3 
+0

對不起,我不好,我只是改變了大聲笑。這是mydata.dbo.testTb1 SET num_cur = num_cur + 1 WHERE section_id = 3 – 2012-03-13 08:49:09

0

這是full join讓你頭疼。

+0

是我是全JOIN的問題謝謝! – 2012-03-13 09:07:03

0

您要求提供FULL JOIN,它與FULL OUTER JOIN同義。這將返回來自inserted的所有行,以及來自testTbl1的所有行。 如果這些行匹配您的連接條件,它們將被連接。否則,空值將出現在未接合端的所有列中。我想你想要一個INNER JOIN

+0

是的,我是全JOIN的問題謝謝! – 2012-03-13 09:06:56

0

試試這個:

CREATE TABLE testTb1(
      id  INT, 
      section_id  INT, 
      current_num_student  INT, 
      max_num_student INT 
    ) 
    INSERT INTO testTb1(id, section_id, current_num_student, max_num_student) VALUES 
    (1, 1, 23, 23), 
    (2, 3, 21, 29), 
    (3, 5, 50, 50) 

    ;CREATE TRIGGER dbo.testTrg 
    on dbo.testTb1 
    AFTER UPDATE 
    AS 
    if EXISTS(select 1 
       FROM inserted 
        INNER JOIN dbo.testTb1 m ON 
         inserted.section_id = m.section_id 
       WHERE inserted.current_num_student >= inserted.max_num_student) 
    Begin 
      RAISERROR ('Can not update data because class is full', 16, 1); 
      rollback tran 
    END 

    select * from testTb1 

    UPDATE testTb1 
    SET current_num_student = current_num_student + 1 
    WHERE Id = 1