实验题目(1)
1 数据完整性。以实验数据库为基础数据,请使用T-SQL语句完成以下内容,并将SQL语句写在实验报告册中:
实验代码、实验过程(界面方式下的抓图)、实验结果(抓图) 1)将数据库stu的表course的cno字段定义为主键,约束名称为cno_pk;
Alter table course add constraint cno_pk primary key (cno)
2)为表course中的字段cname添加唯一值约束;
Alter table course add constraint cname_nq unique (cname)
3)对于数据表sc的sno、cno字段定义为外码,使之与表student的主码sno及表course的主码cno对应,实现如下参照完整性:
删除student表中记录的同时删除sc表中与该记录sno字段值相同的记录;
修改student表某记录的sno时,若sc表中与该字段值对应的有若干条记录,则拒绝修改;
修改course表cno字段值时,该字段在sc表中的对应值也应修改;
删除course表一条记录时,若该字段在在sc表中存在,则删除该字段对应的记录;
向sc表添加记录时,如果该记录的sno字段的值在student中不存在,则拒绝插入;
[通过次表影响主表(外键表)]
Alter table sc
Add constraint sc_fk
foreign key sno references student(sno)
Delete on cascade
Update on no action,
Foreign key cno references course(cno)
Delete on cascade
Update on cascade
4 )定义check约束,要求学生学号sno必须为9位数字字符,且不能以0开头,第二三位皆为0;
Alter table student
Add constraint sno_ck
Check(sno like [1-9]00[0-9][0-9][0-9][0-9][0-9][0-9])
5)定义stu数据库中student表中学生年龄值在16~25范围内;
Alter table student
Add constraint sage_ck
Check(sage between 16 and 25)
6)定义stu数据库student表中学生年龄值默认值为20;
Alter table student
Add constraint sage_def default 20 for sage
7) 修改student表学生的年龄值约束可以为15~30范围内;
Alter table student
Drop constraint sage_ck
Go
Alter table student
Add constraint sage_ck
Check(sage between 15 and 30)
8) 删除表course中字段cname的唯一值约束;
Alter table course
Drop constraint cname_uq
实验题目(2)
2. 以实验数据库为基础数据,编写以下触发器并测试。
实验代码、实验过程(界面方式下的抓图)、实验结果(抓图) 1) 为表course建立一个 INSERT触发器,当插入的新行中课程学分(ccredit)的值不是1~6时,就激活该出发器,撤销该插入操作,并使用RAISERROR语句返回一个错误信。息
Create trigger ccredit_insert on course Before insert
As
Declare @new_credit int
Select @new_credit = ccredit from inserted
If( @new_credit < 1 and @new_credit > 6 )
Begin
raiserror( “学分不符合要求!!”,10,16)
rollback tran
End
2)为course表再创建一个UPDATE触发器,当更新了某门课程的课程号信息时,就激活该触发器级联更新sc表中相关的课程号信息,并使用PRINT语句返回一个提示信息。
Create trigger cno_update on course after update
As
Begin
Declare @new_cno char(9),@old_cno char(9)
Selset @new_cno = cno from inserted
Select @old_cno = cno form deleted
Update sc set cno = @new_cno
where cno = old_cno
Print ‘成功!’
End
3)为student表创建DELECT触发器,在删除中的一条记录的同时将sc表中的相应记录也删除。
Create trigger sno_delete on student after delete
As
Begin
Delete from sc
Where sno in (select sno from deleted)
End
4)创建INSTEAD OF触发器,当向sc表中插入记录时,先检查sno列上的值在student中是否存在,如果存在执行插入操作,如果不存在则提示“该学生不存在”。
Create trigger sno_instead_of on sc instead of insert
As
Declare @new_sno
Select @new_sno = sno from inserted
If (sno not in (select sno from student)
Begin
Raiserror(‘该学生不存在!’,10,16)
Rollback tran
End
5)比较约束与触发器的执行顺序。(在一个表中创建CHECK约束和触发器,然后向表中插入一条不符合约束和触发器的记录,察看谁先发生作用。)
题目四:创建了触发器insert
题目五:创建约束
alter table sc
add constraint grade_ck
check (grade between 0 and 100)
insert sc
values('200515066','01',1000)
insert 语句执行时首先验证约束,同时约束本身也有先后顺序(无默认约束)
1 .验证非空约束(not null)
2 .验证主键约束(primary key)
3 .验证唯一性约束(unique)
4.再次验证相关Check(check)
5.最后执行触发器,如果触发器中也必须保证不违反相关约束和Check