在teaching数据库中,为SC表创建一个Insert触发器(SC_Insert),当SC表录入课程成绩时,如果成绩不低于60分,则Student表中该学号的总学分SCredit字段值自动累加并更新。(提示:做该题前,先通过界面方式在Student表上增加总学分字段:SCredit(INT),然后,将现有记录的SCredit字段值修改为0)
时间: 2023-12-11 12:02:43 浏览: 753
好的,针对您的问题,以下是创建该触发器的 SQL 语句:
```
CREATE TRIGGER SC_Insert
ON SC
AFTER INSERT
AS
BEGIN
DECLARE @Sno CHAR(10), @Grade INT
SELECT @Sno = i.Sno, @Grade = i.Grade
FROM inserted i
IF @Grade >= 60
BEGIN
UPDATE Student
SET SCredit = SCredit + (SELECT Credit FROM Course WHERE Cno = (SELECT Cno FROM inserted WHERE Sno = @Sno))
WHERE Sno = @Sno
END
END
```
该触发器是在 SC 表上创建的,当 SC 表插入新纪录时触发。首先,从插入的记录中获取学号和成绩,判断成绩是否大于等于 60 分,如果是,则获取该学号对应的课程学分值,并将该学分值加上学生的总学分,最后更新 Student 表中该学生的总学分值。
相关问题
-1.在teaching数据库中,为SC表创建一个Insert触发器(SC_Insert),当SC表录入课程成绩时,如果成绩不低于60分, --则Student表中该学号的总学分SCredit字段值自动累加并更新。, --然后,将现有记录的SCredit字段值修改为0)
好的,针对你的问题,我给出以下的SQL语句,用于在teaching数据库中为SC表创建一个Insert触发器SC_Insert:
```
CREATE TRIGGER SC_Insert
AFTER INSERT ON SC
FOR EACH ROW
BEGIN
DECLARE sc_grade INT;
DECLARE s_credit INT;
-- 获取学生所得成绩
SELECT grade INTO sc_grade FROM SC WHERE sno = NEW.sno AND cno = NEW.cno;
-- 获取学生当前总学分
SELECT S.Credit INTO s_credit FROM Student S WHERE S.Sno = NEW.Sno;
-- 如果成绩不低于60分,则累加学分并更新Student表中的SCredit字段值
IF sc_grade >= 60 THEN
UPDATE Student SET Credit = Credit + NEW.Credit WHERE Sno = NEW.Sno;
UPDATE Student SET SCredit = SCredit + NEW.Credit WHERE Sno = NEW.Sno;
ELSE
UPDATE Student SET SCredit = SCredit WHERE Sno = NEW.Sno;
END IF;
-- 将SC表中现有记录的SCredit字段值修改为0
UPDATE SC SET SCredit = 0 WHERE Sno = NEW.Sno AND Cno = NEW.Cno;
END;
```
该触发器会在每次向SC表中插入新的记录时被触发,然后根据插入的成绩是否不低于60分进行操作:如果成绩不低于60分,则会自动累加该学生的总学分和已修学分;否则,只会更新已修学分,而总学分保持不变。最后,将SC表中现有记录的SCredit字段值修改为0,以确保该学生下一次的总学分计算不会包含该门课程的学分。
在teaching数据库中,在course表中创建一个UPDATE触发器(trig_cno),该触发器防止用户修改course表的课程号。
以下是在teaching数据库中,在course表中创建一个防止用户修改课程号的UPDATE触发器(trig_cno)的SQL语句:
```
CREATE TRIGGER trig_cno
BEFORE UPDATE ON course
FOR EACH ROW
BEGIN
IF NEW.cno <> OLD.cno THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cannot modify cno in course table.';
END IF;
END;
```
这个触发器会在每次尝试更新course表的记录之前触发,并检查更新后的课程号是否与原课程号相同。如果不同,就会抛出一个SQL异常,阻止更新操作。
阅读全文