实验六数据库完整性文档格式.docx
- 文档编号:21185412
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:22
- 大小:2.22MB
实验六数据库完整性文档格式.docx
《实验六数据库完整性文档格式.docx》由会员分享,可在线阅读,更多相关《实验六数据库完整性文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
AND@enroll_date<
=GETDATE()
GO
(2)创建学生年龄规则“Age_rule”。
学生年龄必须在15~30岁之间
CREATERULEAge_rule
AS@age>
=15AND@age<
=30
sp_bindruleAge_rule,'
(3)创建学生性别规则“Sex_rule”。
性别只能为“男”或“女”
CREATERULESex_rule
AS@genderIN('
男'
'
女'
)
sp_bindruleSex_rule,'
students.gender'
(4)创建学生成绩规则“Score_rule”。
学生成绩只能在0~100之间
CREATERULEScore_rule
AS@grade>
=0AND@grade<
=100
sp_bindruleScore_rule,'
grades.grade'
(5)用图形方法查看学生成绩规则“Score_rule”,截图为:
(6)用语句方法查看学生成绩规则“Score_rule”,语句为:
EXECsp_helptextScore_rule
2、删除规则Enter_University_date_rule
DROPRULEEnter_University_date_rule
3、创建默认(用图形或者语句方法创建)
(1)创建默认时间“Time_default”为当前系统时间
CREATEDEFAULTTime_default
ASGETDATE()
(2)创建默认入学年龄“Age_default”为18岁
CREATEDEFAULTAge_default
AS18
sp_bindefaultAge_default,'
(3)用图形方法查看默认入学年龄“Age_default”,截图为:
(4)用语句方法查看默认入学年龄“Age_default”,语句为:
EXECsp_helptextAge_default
4、删除默认入学年龄“Age_default”
DROPDEFAULTAge_default
5、创建声明式默认:
在创建表的过程中创建声明式默认
(1)创建表“default_example”,表中包含字段pid、name、sex、age。
要求设定sex的默认值为“男”、age的默认值为18。
输入数据:
编号
姓名
性别
年龄
101
苏晴
女
201
马拯山
20
执行结果为:
CREATETABLEdefault_example
(pidintPRIMARYKEY,
namevarchar(20)NOTNULL,
sexchar(10)DEFAULT'
ageintDEFAULT18
INSERTINTOdefault_example(pid,name,sex)
VALUES(101,'
苏晴'
INSERTINTOdefault_example(pid,name,age)
VALUES(201,'
马拯山'
20)
SELECT*
FROMdefault_example
(2)在表中增加新的默认,将编号默认为100。
插入一条记录,执行结果为:
ALTERTABLEdefault_example
ADDCONSTRAINTpid_defaultDEFAULT100FORpid
INSERTINTOdefault_example(name,sex,age)
VALUES('
张三'
6、在“学生管理数据库”各个数据表中建立相应的主键、外键、惟一值、以及check约束,要求:
学生的年龄必须是两位数,其中第一位是1或2:
Students表
ALTERTABLEstudents
ADDconstraintpk_stud_idPRIMARYKEY(stud_id)
WITHNOCHECK
ADDconstraintck_genderCHECK(genderIN('
))
ADDconstraintck_ageCHECK(age>
=10ANDage<
30)
ADDconstraintck_enroll_dateCHECK(enroll_date>
ANDenroll_date<
=GETDATE())
因为已经创建好主键约束,所以此次主键约束无效,check约束有效
Courses表:
ALTERTABLEcourses
ADDconstraintpk_cidPRIMARYKEY(cid)
ADDconstraintck_creditCHECK(creditISNULLORcredit>
0)
Grades表:
ALTERTABLEgrades
ADDconstraintpk_gradesPRIMARYKEY(stud_id,cid)
ADDconstraintfk_grades1FOREIGNKEY(stud_id)REFERENCESstudents
ADDconstraintfk_grades2FOREIGNKEY(cid)REFERENCEScourses
ADDconstraintck_gradeCHECK(gradeISNULLORgradebetween0and100)
Instructs表:
ALTERTABLEinstructs
ADDconstraintpk_iidPRIMARYKEY(iid,class)
ADDconstraintck_periodCHECK(periodISNULLORperiod>
删除check约束:
Students表:
DROPconstraintck_gender
DROPconstraintck_age
DROPconstraintck_enroll_date
7、完成教科书456页如下习题:
[7.1]a:
CREATETABLEproducts(
pidchar(3)notnull,
pnamenchar(10)notnull,
citynchar(10)notnull,
quantityintnotnullcheck(quantity>
0),
pricedecimal(8,2)notnullcheck(price>
0.00),
primarykey(pid)
CREATETABLEagent(
aidnchar(3)notnull,
anamenchar(10)notnull,
percentintnotnullcheck(percentbeween0and10),
primarykey(aid)
实验6-2触发器
1、使用触发器
(1)创建一个触发器trig_update,返回对“学生表”进行更新操作后,被更新的记录条数
CREATETRIGGERtrig_update
ONstudents
AFTERUPDATE
AS
Print'
TRIGGEROUTPUT:
'
+convert(varchar(5),@@rowcount)+'
rowswereupdated.
(2)执行触发器
UPDATEstudents
SETstud_id=stud_id
WHEREstud_id=20009001
(3)修改触发器trig_update,除返回被更新的记录条数外,再返回学生的所有基本信息
DROPTRIGGERtrig_update;
BEGIN
rowswereupdated.'
SELECT*FROMstudents
END
执行触发器
2、使用触发器的两个特殊表:
插入表(inserted)和删除表(deleted)。
(1)在“学生表”上创建触发器ins_del_sample,在对学生表进行插入、删除或更新操作后,分别从inserted表和deleted表中查询学生学号、姓名、性别、年龄和所在院系。
(请同学们在做删除操作时,注意备份)
SELECT*INTOstudents_copyFROMstudents
CREATETRIGGERins_del_sample
AFTERUPDATE,INSERT,DELETE
INSERTED:
SELECTstud_id,stud_name,gender,age,school
FROMinserted
DELETED:
FROMdeleted
(2)执行插入、删除和更新操作后返回的表有什么区别?
INSERTINTOstudents
VALUES(20026004,'
李四'
19,'
计算机'
软件班'
2002/08/27'
DELETEFROMstudents
WHEREstud_id=20026004
UPDATEstudents
SETage=22
触发了这个触发器trig_update
3、使用系统存储过程查看触发器
(1)显示触发器trig_update的一般信息
EXECSP_HELPtrig_update
(2)显示触发器trig_update的源代码
EXECSP_HELPTEXTtrig_update
(3)显示“学生表”上所有的依赖关系
EXECSP_DEPENDSstudents
(4)显示触发器trig_update所引用的对象
EXECSP_DEPENDStrig_update
4、难题(注意inserted表和deleted表的使用,并请自己修改数据表)
(1)为“成绩表”创建一个触发器,当向表中插入数据时,如果成绩大于等于60分,该学生就能得到相应的学分,否则,该学生不能得到学分。
SELECT*INTOgrades_copyFROMgrades
CREATETRIGGERtrig_grade
ONgrades_copy
AFTERINSERT
UPDATEgrades_copy
SETcredit=0
WHEREgrade<
60andstud_idIN(SELECTstud_idFROMinserted)
测试插入成绩小于60分的学生:
INSERTINTOgrades_copy
VALUES(20023002,'
C801'
59,4)
SELECT*FROMgrades_copy
WHEREstud_id=20023002ANDcid='
测试插入成绩大于等于60分的学生:
C802'
90,4)
(2)为“学生表”创建一个触发器,当删除表中的一个学生资料时,将“成绩表”中的相应记录也删除掉
CREATETRIGGERtrig_students
ONstudents_copy
AFTERDELETE
DELETEFROMgrades_copy
WHEREstud_idIN(SELECTstud_idFROMdeleted)
测试删除学号为20023002的学生:
DELETEFROMstudents_copy
WHEREstud_id=20023002
SELECT*FROMstudents_copy
(3)为“成绩表”创建一个触发器,如果成绩由原来的小于60分更改为大于等于60分时,该学生就得到相应的学分,如果成绩由原来的大于等于60分更改为小于60分,则该学生的相应学分更改为0。
SELECT*INTOgradescopyFROMgrades
CREATETRIGGERtrig_changegrade
ONgradescopy
UPDATEgradescopy
60andstud_idIN(SELECTstud_idFROMinserted)
ANDstud_idIN(SELECTstud_idFROMdeletedWHEREgrade>
=60)
SETgrade=58
WHEREstud_id=20023001ANDcid='
SELECT*FROMgradescopy
5、完成教科书456页如下习题:
[7.11]a:
CREATETRIGGERagent_city
ONagent
IF((SELECTcityFROMinserted)NOTIN(SELECTcityFROMcustomers))
PRINT'
thecityisnotexist,pleaseenteragain!
INSERTINTOagent
a07'
Gray'
NewYork'
6)
[7.11]b:
DROPTRIGGERtrig_prod
SELECT*INTOproducts_copyFROMproducts
CREATETRIGGERtrig_prod
ONorders
UPDATEproducts_copy
SETquantity=quantity-(SELECTqtyFROMinserted)
WHEREpid=(SELECTpidFROMinserted)
INSERTINTOorders
1027'
may'
c002'
a05'
p03'
800,704.00)
FROMproducts_copy
执行插入语句之前:
执行插入语句之后:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 数据库 完整性