【发布时间】:2012-03-13 08:17:55
【问题描述】:
我正在研究比较值的触发器(触发器很难大声笑)
我无法检查应该在 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中输入数据。
因此,我试图制作诸如..的触发器。
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
我收到诸如
之类的消息消息 50000,级别 16,状态 1,过程 testTrg,第 9 行
无法更新数据,因为班级已满 消息 3609,第 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的值
【问题讨论】:
-
这是您对此的第三个问题 - 之前的答案有什么问题?
标签: sql triggers constraints