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 的所有表

SQL server 2008创建触发器实例

SQL Server:检查触发器是启用还是禁用?

sql server 数据库里设置了当插入数据时,便触发器插入更新时间,但我导入数据时,触发器却没有工作。

SQL Server 触发器插入/更新特定列