でチェック値(トリガーが笑難しいです)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_student
はmax_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
これは、この上のあなたの*三*質問です - 前回の答えと間違って何? –