SQL Server 2008 触发器:检查插入的值
Posted
技术标签:
【中文标题】SQL Server 2008 触发器:检查插入的值【英文标题】:SQL Server 2008 Trigger: Checking value in the inserted 【发布时间】: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
的值
【问题讨论】:
这是您对此的第三个问题 - 之前的答案有什么问题? 【参考方案1】:是full join让你头疼。
【讨论】:
【参考方案2】:您已请求FULL JOIN
,它是FULL OUTER JOIN
的同义词。这将返回来自inserted
的所有行,以及来自testTbl1
的所有行。 如果这些行符合您的联接条件,它们将被联接。否则,空值将出现在未连接侧的所有列中。
我想你想要一个INNER JOIN
。
【讨论】:
【参考方案3】:您的第二个更新查询正在使用其他数据库名称,不应该是mydata
UPDATE **cse132b**.dbo.testTb1
SET num_cur = num_cur + 1
WHERE section_id =3
【讨论】:
对不起,我的坏我刚改了哈哈。它是 mydata.dbo.testTb1 SET num_cur = num_cur + 1 WHERE section_id =3【参考方案4】:试试这个:
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
【讨论】:
以上是关于SQL Server 2008 触发器:检查插入的值的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 R2 中为每个表创建创建触发器
如何将一个触发器写入 SQL Server 2008 的所有表