Триггер SQL Server 2008: проверка значения во вставленном - PullRequest
0 голосов
/ 13 марта 2012

Я изучаю триггер для сравнения значений (триггер жесткий lol)

У меня возникают проблемы с проверкой идентификатора, который должен быть внутри 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, Уровень 16, Состояние 1, Процедура testTrg, Строка 9
Невозможно обновить данные, поскольку класс заполнен Msg3609, уровень 16, состояние 1, строка 19 Транзакция завершилась в триггере.Пакет был прерван.

Однако, когда я пытался

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

, который должен иметь значение NO ERROR (должно увеличиваться current_num_student)

Сообщение 50000, Уровень 16, Состояние 1, Процедура testTrg, Строка 9
Невозможно обновить данные, так как класс заполнен
Сообщение 3609, Уровень 16, Состояние 1, Строка 1
Транзакция завершилась в триггере.Пакет был прерван.

Поэтому я предполагаю, что inserted.section_id не содержит никакого значения.

Однако я не совсем уверен, что мои предположения верны или нет.

Если мой синтаксис триггера неверен, вы можете сказать мне ту часть, которую мне нужно исправить?

или

, если синтаксис триггера правильный, подскажите способ печати значения inserted.section

Ответы [ 4 ]

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

Попробуйте это:

    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
0 голосов
/ 13 марта 2012

Это полное соединение головная боль.

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

Вы запросили FULL JOIN, что является синонимом FULL OUTER JOIN. Это вернет все строки из inserted и все строки из testTbl1. Если эти строки соответствуют вашему условию соединения, они будут объединены. В противном случае значения NULL появятся во всех столбцах на несоединенной стороне.

Я думаю, вы хотите INNER JOIN.

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

Ваш второй запрос на обновление использует другое имя базы данных, не должно быть mydata

  UPDATE **cse132b**.dbo.testTb1 
  SET num_cur =  num_cur + 1 
  WHERE section_id =3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...