SQL Server 2008 Trigger: сравнение данных по ключу ввода - PullRequest
1 голос
/ 13 марта 2012

Я изучаю SQL Server 2008 Trigger и у меня возник вопрос об использовании вставленных данных для сравнения данных внутри таблицы.

Например,

Допустим, у нас есть таблица "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.Поэтому мы должны отклонить студента.

запрос похож на ..

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

"?"будет вводить данные пользователем в jsp.

, поэтому я пытался сделать триггер, такой как ...

CREATE TRIGGER testTrg
on dbo.testTb1
    AFTER UPDATE
AS
IF EXISTS(select section_id FROM inserted i join dbo.testTb1 m on i.section_id = m.section_id
            AND m.num_cur = m.num_max)
    BEGIN
        RAISERROR ('Can not update data because class is full', 16,1);
        ROLLBACK TRANSACTION; 
        RETURN
    END

что-то в этом роде

однако яполучаю ошибку как ..

Я не совсем уверен, как решить проблему ..

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Я думаю, что вы должны делать откат вне этого триггера. Возможно, я ошибаюсь, но я думаю, что SQL-серверу понадобится оператор Begin Transaction в той же области.

Mike

0 голосов
/ 13 марта 2012

Не думаю, что вам нужно объединение. Как насчет этого:

CREATE TRIGGER testTrg
on dbo.testTb1
    AFTER UPDATE
AS
IF EXISTS(select 1 FROM inserted i where i.num_cur = m.num_max)
    BEGIN
        RAISERROR ('Can not update data because class is full', 16,1);
        ROLLBACK TRANSACTION; 
        RETURN
    END
...