sql-server - 在 SQL Server 中触发?
问题描述
我有引用学生表的类表。当插入> = 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
解决方案
这里要纠正几点:
我不认为你希望你的触发器放在
dbo_student
桌子上,因为当你第一次插入一个学生时,他们不会有任何分数。我想你想要添加新dbo_score
记录的触发器?如评论中所述,如果您为要更新的表设置别名,则应使用符号,
update <alias>
例如update x
您不用表名/别名作为要更新的列的前缀,SQL Server 知道您正在更新哪个表。
您可能希望将更新限制为受使用
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,您会想要降低它。由于这些原因,重新计算绝对结果比进行增量更改更简单。
推荐阅读
- python - 如何用其中一个键修改 dict
- scala - Spark,检查某些列是否为 True,然后用 Y 或 N 填充新列
- flutter - 如何获得特定范围内的随机 BigInt (Dart)
- php - 是否可以在没有 webhook 的情况下进行 twilio 入站呼叫或短信
- syslog-ng - syslog-ng 尾文件缺少最后一行
- angular - 代码覆盖阈值不会阻止脚本在 Angular 应用程序中运行
- azure-active-directory - 使用组登录 Azure AD 时出现错误 AADSTS50011
- javascript - 未经检查的 runtime.lastError:消息端口在收到响应之前关闭。我该如何解决?
- mysql - 给出 mysql 错误的 Lambda 函数找不到模块 'mysql' 不是函数,即使将其包含在 zip 中也是如此
- makefile - GNU Make 中的 -include 是什么以及它是如何工作的?