目录
实验一、数据库的定义和维护
实验一、数据库的定义和维护
1.使用 T-SQL 语句创建数据库
1)在 Query Analyzer 工具下建立学生选课数据库(XSXK)。
2)根据学生选课数据库的数据库物理结构设计,定义基本表、定义相应的约束条件和索
引。
3)数据库中各表的物理结构和要求如下:
(1) student(学生表)
字段名称 数据类型 长度大小 允许空 备注
sno char 10 学号
sname char 8 姓名
ssex char 2 性别
sage smallint √ 年龄
sdept char 30 √ 所在院系
stel char 13 √ 联系电话
① 主键:sno
② 索引:sname(升序)
③ check 约束:年龄大于 18
④ default 约束:性别默认为男
⑤ 更改学生表的结构,取消姓名不允许为空的约束。
(2)Course (课程表)
字段名称 数据类型 长度大小 允许空 说明
cno char 10 课程编号
cname char 16 课程名称
ccredit smallint 学分
cpno char 10 √ 先行课
① 主键:cno
② 索引: cno (升序)+ccredit(降序)
③ 更改课程表的结构,增加属性列教师 ctech(类型是 char )
3)SC(选课表)
字段名称 数据类型 长度大小 允许空 备注
sno char 10 学号
cno char 10 课程编号
grade smallint √ 成绩
主键:sno+cno
4)各个表的参照完整性约束
(1) FK_SC_ student
主键表:student 外键表:SC
主键:sno 外键:sno
(2) FK_SC_ course
主键表:course 外键表:SC
主键:cno 外键:cno
3.使用 T-SQL 实现学生选课数据库的如下操作:
1)向学生选课数据库中的每个基本表中录入若干条记录,要求记录满足基本表定义的约
束条件。(学生、课程和选课表中各录入 10 条以上记录)。
2)通过 Query Analyzer 实现对学生选课数据库的数据增加、数据删除和数据修改操作。
(1)对于每个学生,求学生的选课门数和平均成绩,并把结果存入学生选课数据库中。
(2)将数据库原理与应用课程的学分修改为 4。
(3)将姓名为“王华”的学生选修数据库原理及应用课程的成绩增加 5 分。
(4)删除选课表中成绩低于 40 分的记录。
(5)删除学号为 2100001 的学生记录,并讨论该删除操作所受到的约束。
(6)删除所有选修课程“JAVA”的选课记录。
(7)将管理学院全体学生的成绩置为空。
(8)删除学生李萍的所有选课记录。
--创建XSXK数据库
CREATE database XSXK;
--创建student表、Course表、SC表
CREATE TABLE student(
sno char(10) PRIMARY KEY,
sname char(8),
ssex char(2) DEFAULT('男'),
sage smallint CHECK(sage>=18),
sdept char(30),
stel char(13)
);
CREATE TABLE Course(
cno char(10) PRIMARY KEY,
cname char(16),
ccredit smallint default null,
cpno char(10)
);
select * from Course
CREATE TABLE SC(
sno char(10),
cno char(10),
grade smallint,
constraint c PRIMARY KEY(sno,cno)
);
--建立索引
create unique index c1 on student(sname ASC);
create unique index c6 on Course(cno ASC,ccredit DESC);
select cno,ccredit from Course where cname in ('java','高等数学');
--建立参照完整性
ALTER TABLE SC ADD CONSTRAINT FK_SC_student FOREIGN KEY(sno) REFERENCES student(sno);
ALTER TABLE SC ADD CONSTRAINT FK_SC_course FOREIGN KEY(cno) REFERENCES Course(cno);
ALTER TABLE SC drop CONSTRAINT FK_SC_course;
ALTER TABLE SC drop CONSTRAINT FK_SC_student;
--在Course表中添加教师列ctech
ALTER TABLE Course ADD ctech char(10);
--添加数据
INSERT INTO student values('2100001','张一','男',21,'shuji','13324539390'),
('2100002','王华','女',21,'shuji','13324539391'),
('2100003','张三','男',21,'renwen','13324539393'),
('2100004','李萍','男',19,'tumu','13324539394'),
('2100005','张五','女',21,'wudian','13324539395'),
('2100006','张六','女',21,'guanli','13324539396'),
('2100007','张七','男',20,'shenggong','13324539397'),
('2100008','张八','女',21,'jiaoke','13324539398'),
('2100009','张九','男',21,'tiyu','13324539399'),
('2100010','张四','男',21,'huaxue','13324539310');
INSERT INTO SC values('2100001','2',70),
('2100002','1',75),
('2100003','3',60),
('2100005','2',70),
('2100004','8',80),
('2100006','11',80),
('2100007','2',70),
('2100004','2',70),
('2100004','6',89),
('2100010','8',79),
('2100006','9',70),
('2100008','1',70),
('2100005','16',70),
('2100010','14',70),
('2100003','6',95),
('2100009','6',98),
('2100006','6',null),
('2100008','6',null),
('2100002','3',30),
('2100009','3',40);
INSERT INTO Course values('1','数据库原理及应用',3,'Java','肖'),
('2','Java',4,'C语言','高'),
('3','C语言',5,'null','蒋'),
('8','马克思主义原理',3,'null','高'),
('6','大学英语',2,'null','蒋'),
('9','大学物理',6,'null','赵'),
('11','高等数学',5,'null','苏'),
('12','大学心理健康',3,'null','皇甫'),
('16','计算机网络原理',3,'null','高'),
('14','概率论',5,'null','李');
--求选课门数、平均成绩并存入学生表中
alter table student add average decimal(4,2);
alter table student add 选课门数 int;
update student set average = (select avg(grade) from SC where sno in ('2100001')) where sno in ('2100001');
update student set average = (select avg(grade) from SC where sno in ('2100002')) where sno in ('2100002');
update student set average = (select avg(grade) from SC where sno in ('2100003')) where sno in ('2100003');
update student set average = (select avg(grade) from SC where sno in ('2100004')) where sno in ('2100004');
update student set average = (select avg(grade) from SC where sno in ('2100005')) where sno in ('2100005');
update student set average = (select avg(grade) from SC where sno in ('2100006')) where sno in ('2100006');
update student set average = (select avg(grade) from SC where sno in ('2100007')) where sno in ('2100007');
update student set average = (select avg(grade) from SC where sno in ('2100008')) where sno in ('2100008');
update student set average = (select avg(grade) from SC where sno in ('2100009')) where sno in ('2100009');
update student set average = (select avg(grade) from SC where sno in ('2100010')) where sno in ('2100010');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100001')) where sno in ('2100001');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100002')) where sno in ('2100002');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100003')) where sno in ('2100003');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100004')) where sno in ('2100004');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100005')) where sno in ('2100005');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100006')) where sno in ('2100006');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100007')) where sno in ('2100007');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100008')) where sno in ('2100008');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100009')) where sno in ('2100009');
update student set 选课门数 = (select count(grade) from SC where sno in ('2100010')) where sno in ('2100010');
--将数据库课程分数修改为4
UPDATE Course SET ccredit = 4 where cname in ('数据库原理及应用');
select * from Course where cname in('数据库原理及应用');
--将王华的数据库成绩增加5分
update SC set grade = grade+5 where sno = (select student.sno from student where sname in ('王华') and cno = (select Course.cno from Course where cname in('数据库原理及应用')));
--删除选课表中成绩低于40的
delete from SC where grade < 40;
select * from SC;
--删除学号2100001的记录,并讨论该删除操作所受到的约束。
alter table SC drop constraint FK_SC_student;
delete from student where sno = '2100001';
--删除Java的选课记录
delete from SC where cno = (select Course.cno from Course where cname in ('java'));
--将guanli学院的所有成绩置空
update SC set grade = null where sno = (select student.sno from student where sdept = 'guanli');
--删除李萍的选课记录
delete from SC where sno = (select student.sno from student where sname = '李萍');
实验二、数据库的简单查询和连接查询
1、简单查询
在学生选课数据库中实现其数据查询操作。
1)查询shujiu学院学生的学号和姓名。
2)查询选修了课程的学生学号。
3)查询选修课程编号为 6 课程的学生学号和成绩,结果按成绩降序排列,如果成绩
相同按学号升序排序。
4)查询选修课程编号为 1 课程,成绩在 80~90 之间的学生学号和成绩,并将成绩乘
以 0.8 输出。
5)查询shenggong学院或shuji学院系姓张的学生的信息。
6)查询缺少了成绩的学生的学号和课程号。
2、连接查询
在学生选课库中实现其数据连接查询操作。
1)查询学生的学号、姓名、选修的课程名称及成绩。
2)查询数计学院学生选修的课程学分大于 2 的课程详细信息。
3)查询所有学生的信息以及他(她)所选课的课程编号和成绩(要求查询结果也显示出没有
选修课程的学生信息)。
4)查询选修课程编号为 6 且成绩在 90 分以上的学生学号、姓名及成绩。
4)查询每一门课的间接先行课(即先行课的先行课)。
5)查询至少选修了两门课程的学生学号。
--简单查询
--查询shujiu学院学生的学号和姓名
select sno,sname from student where sdept in ('shuji');
--查询选修了课程的学生学号
select distinct sno from SC;
--查询选修课程编号为6的学生学号和成绩,结果按成绩降序排列,如果成绩相同按学号升序排序
select sno,grade from SC where cno in ('6') order by grade desc,sno asc;
--查询选修课程编号为1,成绩在80~90之间的学生学号和成绩,并将成绩乘以0.8输出
select * from SC where cno = '1';
select sno,grade*0.8grade from SC where cno in (select cno from Course where cno = '1' ) and grade between 80 and 90;
--查询shenggong学院或shuji学院姓张的学生信息
select * from student where sdept in ('shenggong','shuji') and sname like '张%';
--查询缺少了成绩的学生学号和课程号
select * from SC where grade is null
select sno,cno from SC where grade is NULL;
SELECT * from Course;
--连接查询
--查询学生的学号、姓名、选修的课程名称及成绩
select student.sno,student.sname,Course.cname,SC.grade from student join SC on student.sno = SC.sno join Course on Course.cno= SC.cno;
--查询shuji学院的学生选修的课程学分大于2的课程信息[distinct去重]
select Course.* from SC left join student on SC.sno = student.sno
left join Course on SC.cno = Course.cno
where student.sdept = 'shuji' and Course.ccredit>2;
--(1)查询所有学生的信息以及他所选课的课程编号和成绩
select student.*,Course.*,SC.grade from SC left join student on SC.sno = student.sno
left join Course on SC.cno = Course.cno;
--(2)【要求查询结果也显示出没有选修课程的学生信息】
select student.*,Course.*,SC.grade from student left join SC on student.sno = SC.sno
left join Course on SC.cno = Course.cno;
--查询选修课程编号为6且成绩在90分以上的学生学号、姓名及成绩
select student.sno,student.sname,SC.grade from SC left join student on SC.sno = student.sno where SC.cno = '6' and SC.grade > 90;
--查询每一门课的间接先行课(即先行课的先行课)
select C.cname ,B.cpno from Course C,Course B where C.cpno = B.cname;
--查询至少选修了两门课程的学生学号[where分组前,不可加聚合函数 having分组后过滤,可加聚合函数]
select SC.sno,student.sname from SC left join student on SC.sno = student.sno where SC.sno in (select sc.sno from SC group by SC.sno having count(SC.sno)>1) group by SC.sno,student.sname;
--附加题
--分别统计学院男女性别并加一起
select * from student
select sdept 学院 ,count(*) as 总人数,
count(case when ssex='女' then 1 else null end) 本学院女生人数,
count(case when ssex='男' then 1 else null end) 本学院男生人数
from student GROUP BY student.ssex,student.sdept;
实验三、数据库的嵌套查询和组合查询
1、嵌套查询
在学生选课库中实现嵌套查询操作。
1) 查询选修了 UML 课程的学生学号和姓名。
2) 查询比王华同学年龄大的学生学号和姓名。
3) 查询选修 18084412 课程的成绩低于张三的学生学号和成绩。
4) 查询其他学院中比数计学院学生年龄都小的学生。
5) 查询选修了 18084415 课程的学生姓名。
6) 查询选修了全部课程的学生姓名。
7) 查询至少选修了“2100001”学生所选修课程中一门课程的学生学号的姓名。
8) 查询至少选修了“2100001”学生所选修的全部课程的学生学号的姓名(查询选修课程
包含 “2100001”学生所选课程的学生学号和姓名)。
9)查询既选修了“数据结构”课程又选修了“数据库原理与应用”课程的学生姓名。
10)查询选修了“数据结构”课程或选修了“数据库原理与应用”课程的学生学号。
11)查询选修了“数据结构”课程而没有选修“数据库原理与应用”课程的学生学号。
12)查询全是男同学选修的课程号。
9)-11)任选一个,12)选做
2、组合查询和统计查询
在学生选课库中实现组合和统计查询操作。
1)使用集合运算查询既选修了“数据结构”课程又选修了“数据库原理与应用”课程的学
生姓名。
2)使用集合运算查询选修了“数据结构”课程或选修了“数据库原理与应用”课程的学生
学号。
3)使用集合运算查询选修了“数据结构”课程而没有选修了“数据库原理与应用”课程的
学生学号。
6
4)统计选修了课程的学生人数。
5)查询选修成绩合格,并且选课门次超过 4 门以上学生的学生学号、总成绩。
6)统计各院系的学生人数。
7)统计各年龄的学生人数。
8)统计每个学生的选修课程数目和平均成绩。
9)查询每门课程的详细信息及选课人数。
--插入一些补充数据
insert into student values('2100011','王五','男','23','huaxue','13324539311 ',null,null);
insert into student values('2100012','张麻子','女','22','shuji','13324539321 ',null,null);
insert into student values('2100013','甜甜','男','20','shuji','13324539333 ',null,null);
update student set ssex = '男' where sno = '2100012';
update SC set grade = 50 where sno = '2100009' and cno = '3';
insert into SC values('2100012','1','87'),
('2100012','2','87'),
('2100012','3','87'),
('2100012','6','87'),
('2100012','8','87'),
('2100012','9','87'),
('2100012','11','87'),
('2100012','12','87'),
('2100012','14','87'),
('2100012','16','87');
insert into SC values ('2100013','1','97'),
('2100013','2','97'),
('2100013','3','97'),
('2100013','6','97'),
('2100013','8','97'),
('2100013','9','97'),
('2100013','11','77'),
('2100013','12','77'),
('2100013','14','87'),
('2100013','16','87');
ALTER TABLE SC ADD CONSTRAINT FK_SC_student FOREIGN KEY(sno) REFERENCES student(sno);
--嵌套查询
--查询选修了大学英语【cno为6】的学生学号和姓名
select SC.sno 学号,(select sname from student where student.sno = SC.sno) 姓名
from SC where SC.cno = (select Course.cno from Course where cname = 'c语言');
--查询比王华同学年龄大的学生学号和姓名
select sno 学号, sname 姓名 from student where sage > (select sage from student where sname = '王华');
--查询选修了3课程的成绩低于张三的学生学号和成绩
select sno 学号,grade 成绩 from SC where grade < (select grade from SC,student where SC.sno = student.sno and sname = '张三' and cno = '3');
--查询其他学院中比shuji学院学生年龄都小的学生
select * from student where sage < all(select sage from student where sdept = 'shuji'); select * from student;
--查询选修了3课程的学生姓名
select sname 姓名 from student where sno in (select sno from SC where cno = '3');
--查询选修了全部课程的学生姓名
--第一种
select sname from student where not exists(select * from Course where not exists(select * from SC where SC.sno = student.sno and SC.cno = Course.cno));
--第二种:
select sname from student where student.sno in(select SC.sno from SC group by sno having count(cno) = (select count(*) from Course));
--查询至少选修了“2100003”学生所选的课程中一门课程的学生学号和姓名
select sno 学号,sname 姓名 from student where sno in (select distinct SC.sno from SC where(cno in(select cno from SC where sno = '2100003')));
--查询至少选修了“2100003”学生所选的全部课程的学生学号和姓名[--查询选修课程包含“2100003”学生所选课程的学生学号和姓名]
--第一种
select sno,sname from student where sno in (
select distinct sno
from SC a
where not exists(
select * from SC b
where b.sno = '2100003'and not exists (select * from SC c where c.sno = a.sno and c.cno = b.cno)
));
--第二种
select sno 学号,sname 姓名 from student where sno in (
select distinct SC.sno
from SC
where cno in(select cno
from SC
where sno = '2100003')
group by sno having count(*) =
(select count(cno) from SC where sno = '2100003'));
--查询即选修了“大学英语【6】”又选修了“高等数学【11】”的学生姓名
select sname from student
where sno in(select a.sno from
(select sno from SC where cno = (select cno from Course where cname = '大学英语')) a
inner join(select sno from SC where cno = (select cno from Course where cname = '高等数学')) b
on a.sno = b.sno);
--查询即选修了“大学英语【6】”或选修了“高等数学【11】”的学生学号
select distinct sno from SC
where cno in(select cno from Course
where cname ='大学英语'or cname = '高等数学');
--查询即选修了“大学英语【6】”没有选修了“高等数学【11】”的学生学号
select sno from student
where sno in(select a.sno
from (select sno from SC where cno = (select cno from Course where cname = '大学英语')) a
left join (select sno
from SC where cno = (select cno from Course where cname = '高等数学')) b
on a.sno = b.sno
where b.sno is null
);
--查询全是男同学选修的课程号
select distinct cno from SC a
where not exists(select cno from student where ssex = '女' and
exists(select * from SC b where b.cno = a.cno and b.sno = student.sno)
);
--组合查询和统计查询
--使用集合运算查询即选修了“大学英语【6】”又选修了“高等数学【11】”的学生姓名
select sname from student
where sno in(select sno from SC where cno = (select cno from Course where cname = '大学英语'))
intersect
select sname from student
where sno in(select sno from SC where cno = (select cno from Course where cname = '高等数学'));
--使用集合运算查询即选修了“大学英语【6】”或选修了“高等数学【11】”的学生学号
select distinct sno from SC where cno = (select cno from Course where cname = '大学英语')
union
select sno from SC where cno = (select cno from Course where cname = '高等数学');
--使用集合运算查询即选修了“大学英语【6】”没有选修了“高等数学【11】”的学生学号
select sno from SC
where cno = (select cno from Course where cname = '大学英语')
except
select sno from SC
where cno = (select cno from Course where cname = '高等数学');
--统计选修了课程的学生人数
select count(distinct sno)选课人数 from SC;
--查询选修成绩合格(60),且选课门次超过4门以上学生的学生学号、总成绩
select sno,sum(grade)总成绩 from SC where grade >= 60
group by sno
having count(cno)>4;
--统计各院系学生人数
select sdept,count(sdept)各学院人数 from student group by sdept;
--统计各年龄学生人数
select sage,count(sage)各年龄人数 from student group by sage;
--统计每个学生的选修课程数目和平均成绩
select sno,count(cno)选课数目,avg(grade)平均成绩 from SC group by sno;
--查询每门课程的详细信息及选课人数
select Course.* , 选课人数 from Course
left join(select cno,count(cno)选课人数
from SC group by cno)as sc on sc.cno = Course.cno;
实验四、数据库完整性和数据安全性实验
1) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中将 SQL Server
的身份验证模式设置为“Windows 身份验证模式”,断开与对象资源管理器的连接,再
连接对象资源管理器时分别用“Windows 身份验证”和“SQL Server 身份验证”两种
模式登录,再将数据库的身份验证模式设置为“SQL Server 和 Windows 身份验证模式”,
再分别用两种模式登录,分析两种不同的身份验证模式下登录结果。
2) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“Liping”的登录名,再创建用户名为“Liping”的用户,用用户名为“Liping”的
用户登录,对学生表执行一个查询语句,分析查询失败的原因。
3) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中给用户名为
“Liping”的用户授予查询学生表的权限,再用用户名为“Liping”的用户登录,对
学生表执行一个查询语句,分析查询成功的原因。
4) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“Lili”的登录名,再创建用户名为“Lili”的用户,分别用用户名为“Liping”和
“Lili”的用户登录,对课程表执行一个查询语句,分析查询失败的原因。
5) 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
“MyRole”的角色,将用户名为“Liping”的用户和用户名为“Lili”的用户加入该
角色中,对该角色授予查询课程表的权限,分别用用户名为“Liping”和“Lili”的
用户登录,对课程表执行一个查询语句,分析查询成功的原因。
6) 用用户名为“sa”的用户登录,创建一个规则,约束值为“男”或“女”,将该规则绑
定到学生表的“性别”列。在学生表中输入一条非法学生记录(性别值不为“男”和
“女”),体验规则的作用。
7) 用用户名为“sa”的用户登录,创建一个默认值,值为“20”,将该默认值绑定到学生
表的“年龄”列。在学生表中输入一条学生记录(不输入年龄值),体验默认的作用。
8) 用用户名为“sa”的用户登录,对选课表定义一个“insert”触发器,要求插入到选
课表中的记录满足参照完整性约束。
9) 用用户名为“sa”的用户登录,对学生表定义一个“Delete”触发器,要求删除学生
记录的同时把学生的选课记录也删除。
--2.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为,“Liping”的登录名
-- 再创建用户名为“Liping”的用户,用用户名为“Liping”的
-- 用户登录,对学生表执行一个查询语句,分析查询失败的原因
use XSXK
SP_addlogin 'LaiPing','123456';
SP_adduser 'LaiPing';
select * from student;
--3.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中给用户名为
--“Liping”的用户授予查询学生表的权限,再用用户名为“Liping”的用户登录,对
--学生表执行一个查询语句,分析查询成功的原因
grant select on student to LiPing with grant option;
select * from student;
--4.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
--“Lili”的登录名,再创建用户名为“Lili”的用户,分别用用户名为“Liping”和
--“Lili”的用户登录,对课程表执行一个查询语句,分析查询失败的原因。
SP_addlogin 'LiLi','123456';
SP_adduser 'LiLi';
--5.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建名称为
--“MyRole”的角色,将用户名为“Liping”的用户和用户名为“Lili”的用户加入该
--角色中,对该角色授予查询课程表的权限,分别用用户名为“Liping”和“Lili”的
--用户登录,对课程表执行一个查询语句,分析查询成功的原因。
sp_addrole 'MyRole'
sp_addrolemember 'MyRole','LiLi'
sp_addrolemember 'MyRole','LiPing'
grant select on Course to MyRole with grant option;
select * from student;
select * from Course;
--6. 用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建一个规
--则,约束值为“男”或“女”,将该规则绑定到学生表的“性别”列。在学生表中输入
--一条非法学生记录(性别值不为“男”和“女”),体验规则的作用
select * from student;
insert into student values('2100001','张一','男','18','shuji','13324539391',null,null);
delete from student where sno = '1111';
create rule stu_sex as @ssex = '男' or @ssex = '女';
EXEC sp_bindrule 'stu_sex','student.ssex';
insert into student values('2100001','张一','神','20','shuji','13324539391',null,null);
insert into student values('2100001','张一','男','20','shuji','13324539391',null,null);
--7.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中创建一个默
--认值,值为“20”,将该默认值绑定到学生表的“年龄”列。在学生表中输入一条学生
--记录(不输入性别值),体验默认的作用CK__student__sage__38996AB5
create default stu_sage as '20';
EXEC sp_bindefault stu_sage,'student.sage';
insert into student values('2100001','张一','男',,'shuji','13324539391',null,null);
insert into student(sno,sname,sdept,stel) values('11110','张0','数计学院','12345678901')
select * from student where sno = '11110';
--8.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中对选课表定
--义一个“insert”触发器,要求插入到选课表中的记录满足参照完整性约束。
create trigger sc_insert on sc for insert
as if (select count(*)
from student a,inserted b,course c
where a.sno = b.sno and c.cno=b.cno) = 0
begin
ROLLBACK TRANSACTION
raiserror('不能插入!',16,10)
end
insert into sc values('2100003','1',80)
select * from sc where sno = '2100003'
--9.用用户名为“sa”的用户登录,在“SQL Server Management Studio”中对学生表定
--义一个“Delete”触发器,要求删除学生记录的同时把学生的选课记录也删除
create trigger student_delete on sc for delete
as
declare @sno varchar(11)
select @sno=sno from deleted
delete from student where sno=@sno
delete from sc where sno='2100002'
select * from student
select * from sc where sno = '2100002';