数据库 实验五 完整性控制

文章详细描述了如何创建三个数据库触发器,分别用于限制选课人数、学生选课门数和监控成绩变动。第一个触发器确保‘数据库’课程不超过5人,第二个触发器限制计科系学生选课不超过3门,第三个触发器记录成绩变化超过10%的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建一个触发器,“数据库”课程的选课人数不能超过5人。

CREATE TRIGGER S_1 ON SC
AFTER INSERT AS
	DECLARE @COUNT INT,@Sno CHAR(9),@Cno CHAR(4),@Grade SMALLINT;
	SELECT @COUNT=COUNT(*) FROM Course,SC WHERE Course.Cno=SC.Cno AND Course.Cname='数据库'
	SELECT @Sno=Sno,@Cno=Cno,@Grade=Grade FROM INSERTED;
IF(@COUNT>5)
  	BEGIN
    		DELETE FROM SC WHERE @Sno=Sno AND @Cno=Cno
  	END

    查询现有数据

	查询现有数据
SELECT * FROM Course,SC 
WHERE Course.Cno=SC.Cno 
AND Course.Cname='数据库';

删除sc表中所有数据

DELETE FROM SC;

重新插入sc表数据

INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','1',92);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','2',85);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','3',88);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','2',90);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','3',80);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','8',92);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215123 ','4',85);

再进行进行查询

	SELECT * FROM Course,SC 
WHERE Course.Cno=SC.Cno 
AND Course.Cname='数据库';

删除触发器S_1

2. 创建一个触发器,规定计科系每位同学选课门数不能超过3门。

CREATE TRIGGER S_2 ON SC
AFTER INSERT AS
	DECLARE @COUNT INT,@Sno CHAR(9),@Cno CHAR(4),@Grade SMALLINT;
	SELECT @Sno=Sno,@Cno=Cno,@Grade=Grade FROM INSERTED;
	SELECT @COUNT=COUNT(*) FROM Student WHERE Sdept='计科系'
IF(@COUNT>3)
	BEGIN
		DELETE FROM SC WHERE @Sno=Sno AND @Cno=Cno
	END;

查询现有数据

SELECT * FROM Course,SC 
WHERE Course.Cno=SC.Cno 
ORDER BY SC.Sno;

删除SC表中的所有数据

DELETE FROM SC;

重新插入数据

INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','1',92);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','2',85);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215121 ','3',88);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','2',90);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','3',80);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215122 ','8',92);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215123 ','4',85);
INSERT  INTO SC(Sno,Cno,Grade) VALUES ('201215123 ','5',88);

再进行查询

SELECT * FROM Student,Course,SC 
WHERE Course.Cno=SC.Cno 
ORDER BY SC.Sno;

3. 创建一个触发器,当修改成绩表中成绩时,如果变化幅度超过10%,将操作记录在下表SC_U(Sno,Cno,Oldgrade,Newgrade中。

创建表SC_U

CREATE TABLE SC_U(
  Sno CHAR(9), 
  Cno CHAR(4),  
  OldGrade SMALLINT,
  NewGrade SMALLINT
  PRIMARY KEY (Sno,Cno),
  FOREIGN KEY (Sno) REFERENCES T.Student(Sno),
  FOREIGN KEY (Cno) REFERENCES T.Course(Cno)
);

创建触发器S_3

         

CREATE TRIGGER S_3 ON SC
AFTER UPDATE AS
	DECLARE @COUNT INT,@Sno CHAR(9),@Cno CHAR(4),@OldGrade SMALLINT,@NewGrade SMALLINT;
IF UPDATE(Grade)
BEGIN
	SELECT @Sno=Sno,@Cno=Cno,@NewGrade=Grade FROM INSERTED;
	SELECT @Sno=Sno,@Cno=Cno,@OldGrade=Grade FROM DELETED;
IF(@NewGrade > @OldGrade+@OldGrade*0.1)
	BEGIN
		INSERT INTO SC_U VALUES(@Sno,@Cno,@OldGrade,@NewGrade)
	END
END

查询之前的成绩        

SElECT * FROM SC
WHERE Cno = '3'
AND Sno='201215122'

更新成绩

UPDATE SC SET Grade = '100' 
WHERE Cno = '3' 
AND Sno='201215122';

查询更新后成绩

SElECT * FROM SC  WHERE Cno = '3' 
AND Sno='201215122';

查询SC_U看是否有记录

SELECT * FROM SC_U;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值