根据10-1触发器的定义语法规则,参照10-2关于DML触发器(触发事件为INSERT、UPDATE、DELETE的触发器)的创建和管理示例,尽量本地或平台上完成练习; 在命令窗口使用sqlcmd命令行工具连接SQL SERVER服务器,导入本实验用的数据库脚本文件ex10.sql: sqlcmd -m 1 -S localhost -U sa -P '<123123Aa!@>' -i '/data/workspace/myshixun/src/ex10.sql' 再次登录检查数据库JX是否创建成功,数据表及数据是否正常 sqlcmd -m 1 -S localhost -U sa -P '<123123Aa!@> 若不正常,重复上面操作;正常则使用T-SQL命令完成如下要求并补全到step2.sql中“-----------BEGIN-------”和“--------END------”区域: 创建触发器tri_RestrictXK,以保证每门课的选课人数不超过4人;(提示:可选用INSTEAD OF 触发器) 创建触发器tri_UpdateTeacher,以保证在修改某教师的教师号时同时修改选课表中该教师的教师号;(提示:可用FOR触发器) SET NOCOUNT ON GO USE JX GO SET NOCOUNT ON GO ---------BEGIN----------- DELIMITER $$ CREATE TRIGGER fku BEFORE UPDATE ON choose FOR EACH ROW BEGIN IF (NEW.score < 0 or NEW.score > 100) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '188您所输入的分数必须是0-100'; END IF; END$$ DELIMITER ; ----------END------------- ----***测试代码,请勿删除***------ INSERT INTO SC(Sno,Cno,Tno) VALUES('21009','2','4') GO INSERT INTO SC(Sno,Cno,Tno) VALUES('21009','7'
时间: 2025-05-22 18:44:53 浏览: 29
### 创建DML触发器以实现业务逻辑
#### 限制选课人数的触发器 `tri_RestrictXK`
此触发器将在学生选课时检查每门课程的学生数量是否超过设定的最大值(即4人),如果是,则阻止进一步的选择操作。
```sql
CREATE TRIGGER tri_RestrictXK
ON SC -- 假设SC是选课表,包含sno(学号),cno(课程编号) 和 grade (成绩)
AFTER INSERT, UPDATE
AS
BEGIN
IF (
SELECT COUNT(*)
FROM SC s JOIN inserted i ON s.cno = i.cno AND s.sno != i.sno
GROUP BY s.cno HAVING COUNT(*) >= 4
) > 0
BEGIN
RAISERROR ('The maximum number of students per course has been reached.', 16, 1);
ROLLBACK TRANSACTION;
END;
END;
GO
```
这个触发器会在每次有新的记录插入或现有记录更新到`SC`表时激活。它通过比较受影响行(`inserted`)和其他已经存在于表中的行来计算每个课程的学生数[^1]。
#### 同步更新教师号的触发器 `tri_UpdateTeacher`
另一个触发器用来确保每当某个课程关联的新老师被指派时,所有相关的选课记录都会自动反映这一变化。
```sql
CREATE TRIGGER tri_UpdateTeacher
ON Course -- 假设Course表中有cno(课程编号)和tno(教师编号)
AFTER UPDATE
AS
BEGIN
IF UPDATE(tno)
BEGIN
UPDATE SC SET tno = inserted.tno
FROM SC INNER JOIN inserted ON SC.cno = inserted.cno;
END;
END;
GO
```
在此处,我们监听的是针对`Course`表发生的任何更改。如果发现`tNo`(教师ID字段)发生了改变,那么就相应调整那些涉及到相同课程的所有学生的选课信息[^2]。
#### 测试代码
为了验证这些触发器的行为是否符合预期,可以编写一些测试用例来进行模拟场景下的数据操纵尝试:
```sql
-- 添加几个初始条件以便于后续试验
INSERT INTO Student VALUES ('S1', 'Alice'), ('S2', 'Bob');
INSERT INTO Course VALUES ('C1', 'Mathematics', 'T1');
-- 尝试向满员班级添加更多学员应失败
INSERT INTO SC(sno, cno) VALUES ('S1','C1'),('S2','C1'); -- 成功两次加入不同学生
INSERT INTO SC(sno, cno) VALUES ('S3','C1'); -- 应该抛错因为达到上限
-- 更改授课老师的案例演示
UPDATE Course SET tno='T2' WHERE cno='C1';
SELECT * FROM SC WHERE cno='C1'; -- 查看结果确认teacher id已被同步修改
```
以上就是基于给定需求设计的一套解决方案及其配套检验手段[^3]。
阅读全文
相关推荐


















