创建触发器sc_delete,当删除student表中的一条学生记录时,自动删除score表中对应学生的选课记录
时间: 2024-03-28 15:40:02 浏览: 189
可以使用如下的 SQL 语句创建一个名为 `sc_delete` 的触发器,实现删除学生表中学生记录时自动删除 score 表中对应学生的选课记录:
```
CREATE TRIGGER sc_delete
AFTER DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM score WHERE student_id = OLD.student_id;
END;
```
这里使用了 `AFTER DELETE` 指示器,表示在删除操作执行后触发该触发器。`FOR EACH ROW` 表示在每一行删除操作完成后都会执行触发器中的代码。`OLD.student_id` 表示被删除的学生记录中的学号(即旧的学号),这个学号将被用来删除 score 表中对应学生的选课记录。具体来说,`DELETE FROM score WHERE student_id = OLD.student_id` 表示删除 score 表中学号为 `OLD.student_id` 的记录,即被删除的学生对应的选课记录。
相关问题
(1)在两个表间建立为维护参照完整性使用的级联删除触发器、级联修改触发器和受限插入触发器。 (2)建立一个学生选课数不超5门的触发器; (3)建立一个触发器,教授工资不得低于4000元,若低于4000,自动改为4000元。 (4)建立一个触发器,当对表SC的grade属性修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(sno,cno,Oldgrade,Newgrade)中,其中Oldgrade修改前的分数,Newgrade修改后的分数。
(1)建立级联删除触发器:
```
CREATE TRIGGER tr_del_course
ON course
FOR DELETE
AS
BEGIN
DELETE FROM score WHERE cno IN (SELECT cno FROM deleted)
END
```
```
CREATE TRIGGER tr_del_student
ON student
FOR DELETE
AS
BEGIN
DELETE FROM score WHERE sno IN (SELECT sno FROM deleted)
END
```
建立级联修改触发器:
```
CREATE TRIGGER tr_update_course
ON course
FOR UPDATE
AS
BEGIN
UPDATE score SET cno = inserted.cno WHERE cno IN (SELECT cno FROM deleted)
END
```
```
CREATE TRIGGER tr_update_student
ON student
FOR UPDATE
AS
BEGIN
UPDATE score SET sno = inserted.sno WHERE sno IN (SELECT sno FROM deleted)
END
```
建立受限插入触发器:
```
CREATE TRIGGER tr_insert_score
ON score
FOR INSERT
AS
BEGIN
IF (SELECT COUNT(*) FROM score WHERE sno = inserted.sno) >= 5
RAISERROR ('每个学生最多只能选5门课程!', 16, 1)
END
```
(2)建立学生选课数不超过5门的触发器:
```
CREATE TRIGGER tr_insert_score
ON score
FOR INSERT
AS
BEGIN
DECLARE @sno CHAR(10)
SET @sno = (SELECT sno FROM inserted)
IF (SELECT COUNT(*) FROM score WHERE sno = @sno) >= 5
BEGIN
RAISERROR ('每个学生最多只能选5门课程!', 16, 1)
ROLLBACK TRANSACTION
END
END
```
(3)建立教授工资不得低于4000元的触发器:
```
CREATE TRIGGER tr_update_teacher
ON teacher
FOR UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE salary < 4000)
BEGIN
UPDATE teacher SET salary = 4000 WHERE tid IN (SELECT tid FROM inserted WHERE salary < 4000)
END
END
```
(4)建立当对表SC的grade属性修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(sno,cno,Oldgrade,Newgrade)中的触发器:
```
CREATE TRIGGER tr_update_score
ON score
FOR UPDATE
AS
BEGIN
DECLARE @sno CHAR(10), @cno CHAR(10), @Oldgrade DECIMAL(5,2), @Newgrade DECIMAL(5,2)
SELECT @sno = sno, @cno = cno, @Oldgrade = deleted.grade, @Newgrade = inserted.grade
FROM inserted INNER JOIN deleted ON inserted.sno = deleted.sno AND inserted.cno = deleted.cno
IF @Newgrade > @Oldgrade * 1.1
BEGIN
INSERT INTO SC_U (sno, cno, Oldgrade, Newgrade) VALUES (@sno, @cno, @Oldgrade, @Newgrade)
END
END
```
数据库原理实验报告数据库备份和恢复的技能;SQLServer的安全认证模式的设置;用企业管理器进行触发器设计,实现数据完整性控制。1.为学生表建一触发器,当修改年龄,年龄变小时不做修改。2.在SC上定义更新触发器,使其限制修改过的成绩不能低于原来的成绩3.在课程表中增加Total列,代表选择了本门课程的人数,初值为0。4.定义一个触发器,当向SC中插入选课情况时,对应课程的选修人数加1。5.定义一个触发器,当SC中删除选课情况时,对应课程的选修人数减法1。6.创建一存储过程,用于求‘数据库’的平均成绩7.创建一存储过程,用于求某门课的平均成绩。8.创建一存储过程,用于输出某位同学的所有考试成绩。要求显示课程名和分数
实验报告:数据库备份和恢复的技能;SQLServer的安全认证模式的设置;用企业管理器进行触发器设计,实现数据完整性控制。
1. 触发器设计
为学生表建一触发器,当修改年龄时,若年龄变小不做修改。
代码如下:
```
CREATE TRIGGER age_control
ON student
FOR UPDATE
AS
BEGIN
DECLARE @age int
SELECT @age = age FROM inserted
IF @age < (SELECT age FROM deleted)
BEGIN
PRINT 'Age cannot be decreased.'
ROLLBACK TRANSACTION
END
END
```
2. 更新触发器设计
在SC表上定义更新触发器,使其限制修改过的成绩不能低于原来的成绩。
代码如下:
```
CREATE TRIGGER score_control
ON SC
FOR UPDATE
AS
BEGIN
IF EXISTS(SELECT * FROM inserted i JOIN deleted d ON i.s_id = d.s_id AND i.c_id = d.c_id WHERE i.score < d.score)
BEGIN
PRINT 'Score cannot be decreased.'
ROLLBACK TRANSACTION
END
END
```
3. Total列设计
在课程表中增加Total列,代表选择了本门课程的人数,初值为0。
代码如下:
```
ALTER TABLE course ADD Total int NOT NULL DEFAULT 0
```
4. 插入触发器设计
定义一个触发器,当向SC表中插入选课情况时,对应课程的选修人数加1。
代码如下:
```
CREATE TRIGGER add_sc
ON SC
FOR INSERT
AS
BEGIN
UPDATE course SET Total = Total + 1 WHERE c_id = (SELECT c_id FROM inserted)
END
```
5. 删除触发器设计
定义一个触发器,当从SC表中删除选课情况时,对应课程的选修人数减1。
代码如下:
```
CREATE TRIGGER delete_sc
ON SC
FOR DELETE
AS
BEGIN
UPDATE course SET Total = Total - 1 WHERE c_id = (SELECT c_id FROM deleted)
END
```
6. 存储过程设计
创建一存储过程,用于求‘数据库’的平均成绩。
代码如下:
```
CREATE PROCEDURE get_avg_score
AS
BEGIN
SELECT AVG(score) AS avg_score FROM SC WHERE c_id = '数据库'
END
```
7. 存储过程设计
创建一存储过程,用于求某门课的平均成绩。
代码如下:
```
CREATE PROCEDURE get_course_avg_score
@c_id char(4)
AS
BEGIN
SELECT AVG(score) AS avg_score FROM SC WHERE c_id = @c_id
END
```
8. 存储过程设计
创建一存储过程,用于输出某位同学的所有考试成绩。要求显示课程名和分数。
代码如下:
```
CREATE PROCEDURE get_student_score
@s_id char(8)
AS
BEGIN
SELECT c.c_name, s.score
FROM SC s JOIN course c ON s.c_id = c.c_id
WHERE s.s_id = @s_id
END
```
以上就是本次实验的报告内容,包括数据库备份和恢复的技能,SQLServer的安全认证模式的设置,以及触发器和存储过程的设计实现。
阅读全文