为course表创建一个insert触发器,要求“插入的课程记录中,学分不能低于2分,如果低于2分,则自动将其更改为2分”。
时间: 2024-05-22 08:15:04 浏览: 45
没有问题,这是一个技术问题,我可以回答。以下是SQL Server中创建触发器的代码:
CREATE TRIGGER trg_InsertCourse
ON course
AFTER INSERT
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM deleted)
BEGIN
UPDATE course
SET credit = 2
FROM inserted i
WHERE course.course_id = i.course_id
AND i.credit < 2;
END
END
这个触发器会在向course表中插入记录之后执行。如果插入的课程学分低于2分,触发器会自动将其更改为2分。
相关问题
学生表:Student(Sno,Sname,Ssex,Sage,Sdept),各属性分别表示学号(char(9)),学生姓名(char(20)),性别(char(2)),年龄(smallint),系别(char(20)) 课程表:Course(Cno,Cname,Cpno,Ccredit),各属性分别表示课程号(char(4)),课程名(char(40)),先修课程号(char(4)),学分(smallint) 学生选课表:SC(Sno,Cno,Grade),各属性分别表示学号(char(9)),课程号(char(4)),成绩(smallint) (1)定义触发器SC_trig,在向Sc表中插入一条记录时,通过触发器检查记录的学号值在student表中是否存在,若不存在,则取消插入或操作。 (2)定义触发器C_trig,实现约束,输入或更新课程的学分不能大于5,如果大于5,则自动改为5。
(1) 触发器SC_trig的SQL语句如下:
```
CREATE TRIGGER SC_trig
BEFORE INSERT ON SC
FOR EACH ROW
BEGIN
DECLARE sno_count INT;
SELECT COUNT(*) INTO sno_count FROM Student WHERE Sno = NEW.Sno;
IF sno_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Inserted student does not exist!';
END IF;
END;
```
该触发器在每次向SC表中插入一条记录之前,会先查询Student表中是否存在该记录对应的学号,如果不存在,则会抛出一个SQL异常,从而取消插入或操作。
(2) 触发器C_trig的SQL语句如下:
```
CREATE TRIGGER C_trig
BEFORE INSERT ON Course
FOR EACH ROW
BEGIN
IF NEW.Ccredit > 5 THEN
SET NEW.Ccredit = 5;
END IF;
END;
```
该触发器在每次向Course表中插入一条记录之前,会先判断该记录的学分是否超过了5分,如果超过了,则会自动将其修改为5分。
对SC1表设计一个触发器,该触发器保证每个学生所选课程的总学分不超过12分。用SQL语句验证此触发器。
以下是对SC1表设计的触发器:
```sql
CREATE TRIGGER check_credit
BEFORE INSERT OR UPDATE ON SC1
FOR EACH ROW
BEGIN
DECLARE total_credit INT;
SELECT SUM(Credit) INTO total_credit FROM Course WHERE Course_id IN (SELECT Course_id FROM SC1 WHERE Sno = NEW.Sno);
IF total_credit + NEW.Credit > 12 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The total credits of selected courses cannot exceed 12!';
END IF;
END;
```
触发器检查了每个学生所选课程的总学分是否超过12分。在插入或更新SC1表中的数据时,触发器会计算学生已选课程的总学分,并与将要插入或更新的课程的学分求和。如果总学分超过12,则触发器会抛出一个错误信息。
以下是用SQL语句验证此触发器的方法:
首先,我们需要创建SC1表和Course表,插入一些数据:
```sql
CREATE TABLE SC1 (
Sno CHAR(10),
Course_id CHAR(8),
Score INT,
Credit INT,
PRIMARY KEY (Sno, Course_id)
);
CREATE TABLE Course (
Course_id CHAR(8),
Course_name VARCHAR(20),
Credit INT,
PRIMARY KEY (Course_id)
);
INSERT INTO Course VALUES ('C1', 'Math', 4);
INSERT INTO Course VALUES ('C2', 'English', 3);
INSERT INTO Course VALUES ('C3', 'Physics', 5);
INSERT INTO SC1 VALUES ('S1', 'C1', 80, 4);
INSERT INTO SC1 VALUES ('S1', 'C2', 90, 3);
```
接下来,我们尝试插入一条学生选课记录,使其总学分超过12:
```sql
INSERT INTO SC1 VALUES ('S1', 'C3', 85, 6);
```
这时,触发器会抛出以下错误信息:
```
ERROR 1644 (45000): The total credits of selected courses cannot exceed 12!
```
可以看到,触发器成功地检测到了学生选课总学分超过12的情况,并抛出了错误信息。
阅读全文