为“成绩管理”数据库中的tscore表设置触发器,限制“数据库”课程选课人数不超过3人,若选满,则提示“对不起,已选满!”;编写测试语句进行测试。用sql sever 语言,有课程编号,学号,课程号
时间: 2024-12-25 21:30:03 浏览: 3
在SQL Server中,我们可以创建一个DDL(Data Definition Language)触发器来实现这个需求。首先,我们需要创建一个名为`tscore`的表,并添加字段如`course_id`, `student_id`, 和一个表示选课状态的字段`is_selected`。假设我们已经有一个包含`course_id`和`student_id`的原始数据表叫做`courses`。
```sql
CREATE TABLE tscore (
course_id INT,
student_id INT,
is_selected BIT NOT NULL DEFAULT 0,
CONSTRAINT PK_tscore PRIMARY KEY (course_id, student_id)
);
CREATE TRIGGER tr_limit_select
ON tscore
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT 1
FROM inserted i
JOIN courses c ON i.course_id = c.course_id
GROUP BY c.course_id
HAVING COUNT(*) >= 3
)
BEGIN
DECLARE @message NVARCHAR(100) = '对不起,已选满!';
raiserror(@message, 16, 1);
RETURN;
END;
END;
```
在这个触发器中,当一条新的记录被插入到`tscore`表时,它会检查是否有超过3个学生选择了同一个课程。如果有,触发器将阻止插入并显示错误信息。
现在来编写一个简单的测试语句:
```sql
INSERT INTO tscore (course_id, student_id)
VALUES (1, 1), (1, 2); -- 这两个记录会被允许
-- 插入第三个学生,触发器应该起作用
INSERT INTO tscore (course_id, student_id)
VALUES (1, 3);
-- 使用RAISERROR模拟实际错误处理,因为我们在触发器中直接抛出错误
DECLARE @result INT;
SET @result = TRY_CAST((SELECT * FROM tscore WHERE course_id = 1) AS INT); -- 如果引发错误,这行会失败
IF @result IS NULL
BEGIN
PRINT '测试通过,已达到选课上限';
END
ELSE
BEGIN
PRINT '测试失败,未达到预期结果';
END;
```
阅读全文