【问题标题】:Trigger in SQL server?在 SQL Server 中触发?
【发布时间】:2020-03-18 08:01:12
【问题描述】:

我有引用学生表的类表。 当插入 >=8 的英语科目分数时,我写了一个触发器到 +1 exellent_eng 的数量,但它有错误:

消息 4104,级别 16,状态 1,过程 tr_addExellentEnglishStudent,第 3 行 [批处理开始第 1 行] 无法绑定多部分标识符“x.exellent_Eng”。

我正在使用 SSMS。

CREATE TRIGGER tr_addExellentEnglishStudent ON dbo.dbo_student AFTER INSERT AS 
BEGIN
    UPDATE dbo.dbo_class
    SET x.exellent_Eng += 1
    FROM dbo.dbo_class x
    JOIN dbo.dbo_student s ON s.class_id = x.class_id
    JOIN dbo.dbo_score c ON c.student_id = s.student_id
    WHERE (c.subject_id = 1 AND c.score_id >= 8)
END

【问题讨论】:

  • 应该是UPDATE x,而不是UPDATE dbo.dbo_class,但是为什么您的触发器没有引用inserted 对象?
  • @Larnu 用SQL Server,也可以是UPDATE dbo.dbo_class
  • 要么使用UPDATE x SET x.exellent_Eng ...,要么删除x.
  • 没错,@GSerg,但UPDATE x 更清楚。 UPDATE dbo.dbo_ClassFROM dbo.dbo_class x 可以 推断出对象 dbo.dbo_Class 的 2 个实例;尤其是一个有别名,另一个没有。
  • 这个触发器甚至在正确的表上吗?它不应该在dbo_score 表上吗?我假设dbo_student 记录必须在相关学生的任何dbo_score 记录之前创建......对吗?

标签: sql-server tsql triggers


【解决方案1】:

这里有几点需要纠正:

  1. 我认为您不希望您的触发器在 dbo_student 表上,因为当您第一次插入学生时,他们不会有任何分数。我想你想要添加新的dbo_score 记录的触发器?

  2. 如 cmets 中所述,如果您为要更新的表设置别名,则应使用符号 update <alias>,例如update x

  3. 您不必为要更新的列添加表名/别名的前缀,SQL Server 知道您正在更新哪个表。

  4. 您可能希望将更新限制为受使用 Inserted 伪表影响的学生。

    CREATE TRIGGER tr_addExellentEnglishStudent ON dbo.dbo_score
    AFTER INSERT AS 
    BEGIN
      UPDATE x SET
        exellent_Eng += 1
      FROM dbo.dbo_class x
      JOIN dbo.dbo_student s ON s.class_id = x.class_id
      JOIN dbo.dbo_score c ON c.student_id = s.student_id
      WHERE (c.subject_id = 1 AND c.score_id >= 8)
      and c.id in (select id from Inserted)
    END

注意:这不考虑可能出现的任何边缘情况,例如如果您将现有分数从 7 更新到 8,那么从技术上讲,您可能希望增加您的 excellent_Eng 结果。同样,如果您删除一个分数或将其从 8 更新到 7,您会想要降低它。由于这些原因,重新计算绝对结果比进行增量更改更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多