2012-03-13 9 views
0

でチェック値(トリガーが笑難しいです)SQL Server 2008のトリガー:私は値を比較するためにトリガーを勉強しています挿入

私は例えばinserted

の内側にあるべきIDを確認するためにトラブルを取得しています、我々はデータ行を持つテーブル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_studentmax_num_studentと同じです。したがって、私たちは学生を拒否しなければなりません。

JSPファイル内のクエリのような..です

update testTb1 
SET current_num_student = current_num_student + 1 
WHERE section_id = ? 

"?" jspでユーザーによって入力データになります。

したがって、私は私のようなメッセージを取得しています

エラーメッセージを返す
UPDATE mydata.dbo.testTb1 
SET num_cur = num_cur + 1 
WHERE section_id = 1 

た場合、私は手動で最初にテストするためにクエリを使用する場合は、このような...

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 

としてトリガーを作成しようとしていました

メッセージ50000、レベル16、状態1、手順testTrg、行9
クラスがいっぱいであるためにデータを更新できない メッセージ3609、レベル16、状態1、行19 トランザクションがトリガで終了しました。バッチは中止されました。

しかし

、私はNO ERRORケース(current_num_studentを増加しなければならない)である必要があります

UPDATE mydata.dbo.testTb1 
SET num_cur = num_cur + 1 
WHERE section_id =3 

をしようとしていた

メッセージ50000、レベル16、状態1、プロシージャtestTrg 、行9
クラスがいっぱいであるため、データを更新できません。
メッセージ3609、レベル16、状態1、行1
トランザクションがトリガで終了しました。バッチは中止されました。

したがって、inserted.section_idには値が含まれていないと推測されています。

しかし、私の推測が正しいかどうかはわかりません。

私のトリガ構文が間違っている場合は、修正する必要がある部分を教えてください。

または

トリガ構文が正しい場合は、2番目の更新クエリは、他のデータベース名を使用しているあなたが私にinserted.section

+1

これは、この上のあなたの*三*質問です - 前回の答えと間違って何? –

答えて

0

の値を印刷する方法を伝えることができ、それはmydata

すべきではありません
UPDATE **cse132b**.dbo.testTb1 
    SET num_cur = num_cur + 1 
    WHERE section_id =3 
+0

申し訳ありませんが、私の悪い私はちょうど笑を変更しました。それはmydata.dbo.testTb1でした。num_cur = num_cur + 1 WHERE section_id = 3 –

0

full joinあなたに頭痛を与えます。

+0

はい私は完全なJOINの感謝の問題でした! –

0

FULL JOINをお尋ねしました。これはFULL OUTER JOINと同義です。これにより、すべての行がinsertedから、すべての行がtestTbl1から返されます。 これらの行が結合条件と一致する場合は、結合されます。そうしないと、結合されていない側のすべての列にNULLが表示されます。

INNER JOINと思っています。

+0

はい私は完全なJOINの感謝の問題でした! –

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 
関連する問題