【问题标题】:SQL Server 2008 Trigger: Checking value in the insertedSQL Server 2008 触发器:检查插入的值
【发布时间】: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


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 2018-09-09
        相关资源
        最近更新 更多