数据完整性:学生管理系统练习

前言:

这次试验报告搞的心态爆炸,还好有大哥在。

直接进入正题:

1.在studentsdb数据库中用CREATE TABLE语句创建表stu_con,并同时创建约束。
(1)创建表的同时创建约束。表结构如图1所示。
在这里插入图片描述
图1 要创建的表的结构
约束要求如下:
① 将学号设置为主键(PRIMARY KEY),主键名为pk_sid。
② 为姓名添加唯一约束(UNIQUE),约束名为uk_name。
③ 为性别添加默认约束(DEFAULT),默认名称为df_sex,其值为“男”。
④ 为出生日期添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:出生日期>‘1988-1-1’。
(2)使用ALTER TABLE语句的DROP CONSTRAINT删除为stu_con表所建的约束。

2.为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名称为fk_sid;为student_info表的“性别”添加默认约束,值为’男’。

3.为grade表建立一个名为insert_g_tr 的INSERT触发器,当用户向grade表中插入记录时,如果插入的是在curriculum表中没有的课程编号,并且插入的是student_info表中没有的学号,则提示用户不能插入记录,否则提示记录插入成功。
变量定义:DECLARE @kcbh varchar(8)
提示:记录插入成功对应的语句为“PRINT ‘记录插入成功’”
提示:不能插入记录对应的语句为“RAISERROR(‘不能插入记录’,16,1)”

4.为curriculum表创建一个名为del_c_tr的DELETE触发器,该触发器的作用是禁止删除curriculum表中的记录。

5.为student_info表创建一个名为update_s_tr的UPDATE触发器,该触发器的作用是禁止更新student_info表中的“姓名”字段的内容。

6.为student_info表建立删除触发器del_s_tr,要求当student_info表的记录被删除后,grade表中相应的记录也能自动删除。

7.基于student_info表、curriculum表和grade表,建立一个名为v_stu_g的视图,视图中具有所有学生的学号、姓名、课程编号、课程名称、分数。为视图v_stu_g建立插入操作的instead of 触发器,当针对v_stu_g插入记录时,实际上分别向student_info表、curriculum表和grade表插入一条记录:student_info(学号,姓名),curriculum(课程编号,课程名称),grade(学号,课程编号,分数)。

8.使用Transact-SQL语句DROP TRIGGER删除update_s_tr触发器。

1.
CREATE TABLE stu_con
(
学号char(4),
姓名char(8),
性别char(2),
出生日期datetime,
家庭地址varchar(50),
constraint pk_sid primary key (学号),
constraint uk_name unique (姓名),
constraint ck_bday check (出生日期>'1988-1-1')
)

alter table stu_con
add constraint df_sex default '男' for 性别

2.
alter table grade
	add constraint fk_sid foreign key(学号)references student_info(学号)

alter table student_info
	add constraint df_sex default '男' for 性别
	
3.
create trigger insert_g_tr on grade
for insert as

begin 
	declare @errcno char(4),@errsno char(4)
	select @errcno=课程编号,@errsno=学号from inserted
	if(@errcno not in (select 课程编号from curriculum) or @errsno not in (select 学号from student_info))
		begin
		raiserror('不能插入记录',16,1)
		rollback transaction
		end
	else
		print '记录插入成功'
end

4.
create trigger del_c_tr on curriculum
for delete as
begin
	rollback transaction
end

5.
create trigger update_s_tr on student_info
instead of update
as if update(姓名)
print('禁止更新')
begin
	rollback transaction
end

6.
create trigger del_s_tr on student_info
after delete as
begin
	declare @stuno char(4)
	select @stuno = 学号from deleted
	delete from grade where 学号=@stuno
end

7.
create trigger v_stu_g_tr on v_stu_g instead of insert
as
begin 
	declare @sno char(4),@name char(4),@cno char(4),@cn char(50),@stugrade real
	select @sno = 学号,@name=姓名,@cno=课程编号,@cn=课程名称,@stugrade=分数from inserted
	insert into student_info(学号,姓名) values(@sno,@name)
	insert into curriculum(课程编号,课程名称) values(@cno,@cn)
	insert into grade(学号,课程编号,分数) values(@sno,@cno,@stugrade)
end

8.
drop trigger update_s_tr

猜你喜欢

转载自blog.csdn.net/weixin_43912621/article/details/106103442