2011-2012学年第二学期课程实验报告课程名称:数据库系统原理实验名称:数据库控制(二):数据完整性姓名班级学号实验台编号- 同组同学-实验课表现出勤、表现得分25% 25 实验报告得分50%实验总分操作结果得分25% 25实验目的1.掌握数据完整性的概念及分类2.掌握各种完整性的实现方法3.掌握触发器的概念及工作原理4.掌握触发器的创建和使用方法实验内容(实验步骤和实验结果的简单描述,方便同学自己以后阅读)--实验六,数据库控制(二):数据完整性--1. 用户要求:XS表中的学生的专业只能是“计算机”,“数学”,“电子”-- 中的任意一个,请问如何解决该问题?请写出一种具体的解决方法。
ALTER TABLE XS WITH NOCHECKADD CONSTRAINT C1CHECK (专业IN('计算机','数学','电子'))--2. 用户要求:XS表中的学生的年龄必须在岁到岁之间,请问如何解决-- 该问题?请写出一种具体的解决方法。
ALTER TABLE XS WITH NOCHECKADD CONSTRAINT C2CHECK (2012 -YEAR(出生日期)BETWEEN 18 AND 30)--3. 用户要求:在输入XS表中的数据时,若“专业”列没有提供数据,系统应-- 自动取值“计算机”,请问如何解决该问题?请写出一种具体的解决方法。
USE stu10EXEC sp_helpconstraint XSALTER TABLE XSDROP CONSTRAINT DF__XS__专业__023D5A04ALTER TABLE XS ADD CONSTRAINT DF_专业DEFAULT'计算机'FOR专业--4. 用户要求:XS_KC表中的成绩列的取值只能为—之间的整数,且在用户-- 没有输入数据时自动取值,请问如何解决该问题?请写出一种具体的解决-- 方法。
USE stu10EXEC sp_helpconstraint XS_KCALTER TABLE XS_KC WITH NOCHECKADD CONSTRAINT C3CHECK(成绩BETWEEN 0 AND 100)ALTER TABLE XS_KCADD CONSTRAINT C4DEFAULT 0 FOR成绩--5. 编写语句为XS_KC表的“学号”列添加外键约束,该约束参照XS表的主键-- “学号”列。
该约束用于实现何种完整性?向具有该约束的表中添加数据-- 或修改数据时,应注意什么?USE stu10EXEC sp_helpconstraint XS_KCALTER TABLE XS_KCDROP CONSTRAINT FK__XS_KC__学号__0BC6C43EALTER TABLE XS_KCADD CONSTRAINT FK_学号FOREIGN KEY (学号)REFERENCES XS(学号)--6. 用户要求:XS_KC表中的“课程号”列的取值应依赖于KC表中“课程号”的-- 取值,且当KC表中某个“课程号”的取值发生改变时,XS_KC表中的对应的-- “课程号”也应级联更新,当KC表中某个“课程号”被删除时,XS_KC表中对-- 应该“课程号”的数据也应级联删除,请问如何解决该问题?请写出具体的-- 解决方法。
ALTER TABLE XS_KCADD CONSTRAINT FK_课程号FOREIGN KEY(课程号)REFERENCES KC(课程号)ON DELETE CASCADEON UPDA TE CASCADE--7. 创建一触发器,当向XS_KC表插入一记录时,检查该记录的学号在XS表中-- 是否存在,检查该记录的课程号在KC表中是否存在,若有一项为否,则不-- 允许插入。
CREATE TRIGGER T1ON XS_KC AFTER INSERTAS SELECT学号,课程号FROM XS_KCWHERE学号NOT IN(SELECT学号FROM XS)OR课程号NOT IN(SELECT课程号FROM KC)BEGINRAISERROR('不允许插入',16,1)ROLLBACK TRANSACTIONEND--8. 创建一触发器,当在XS表中删除一个学生的基本信息时,级联删除该学生-- 的学习信息(即该学生在XS_KC表中的数据)。
USE stu10EXEC sp_helpconstraint XS_KCCREATE TRIGGER T2ON XS AFTER DELETEAS BEGINALTER TABLE XS_KC DROP CONSTRAINT FK_学号ALTER TABLE XS_KC ADD CONSTRAINT FK_学号FOREIGN KEY (学号)REFERENCES XS(学号)ON DELETE CASCADEEND--9. 在XS_KC表上创建一触发器,若对学号列和课程号列修改,且修改后的学号-- 或课程号在XS表和KC表中不存在,则给出提示信息,并取消修改操作。
CREATE TRIGGER T3ON XS_KC FOR UPDA TEAS SELECT学号,课程号FROM XS_KCWHERE学号NOT IN(SELECT学号FROM XS)OR课程号NOT IN(SELECT课程号FROM KC)BEGINRAISERROR('不允许修改',16,1)ROLLBACK TRANSACTIONEND--10. 在XS_KC表上创建一触发器,当对学生的学习成绩进行插入或修改时,根据-- 学习成绩级联更新该学生在XS表中的总学分(对于插入操作,如果成绩及格-- ,该学生的总学分应为原来的总学分加上该门课程的规定学分,否则总学分-- 不变;对于修改操作,若原成绩不及格而修改后的成绩及格,则该学生的总-- 学分应为原来的总学分加上该门课程的规定学分,若原成绩及格而修改后的-- 成绩不及格,则该学生的总学分应为原来的总学分减去该门课程的规定学分)。
CREATE TRIGGER T4ON XS_KC FOR INSERT,UPDATEAS IF ((SELECT成绩FROM inserted))>= 60BEGIN INSERT INTO XS(总学分)SELECT XS.总学分+KC.学分FROM XS,inserted,KCWHERE inserted.学号=XS.学号AND inserted.课程号=kc.课程号ENDELSE IF ((SELECT成绩FROM XS_KC)< 60 AND(SELECT成绩FROM inserted)>=60)BEGIN UPDATE XS SET XS.总学分=XS.总学分+KC.学分FROM inserted,XS,KCWHERE inserted.学号=XS.学号AND inserted.课程号=KC.课程号ENDELSE IF ((SELECT成绩FROM XS_KC)>= 60 AND(SELECT成绩FROM inserted)< 60)BEGIN UPDATE XS SET XS.总学分=XS.总学分-KC.学分FROM inserted,XS,KCWHERE inserted.学号=XS.学号AND inserted.课程号=KC.课程号END实验过程中遇到的问题以及如何解决的?(可以写多条,是否认真填写将影响实验成绩)在实验过程中我对于创建和修改触发器和完整性约束的语法搞不明白,通过上网百度和问同学稍微清楚,练习比较少,还是不熟练。
本次实验的体会(可以写多条,是否认真填写将影响实验成绩)通过本实验,我理解/了解/熟悉了.......熟悉了完整性约束的添加删除熟悉了触发器的使用方式熟悉了触发器语法熟悉级联式更新删除的语法思考题1.总结一下完整性约束的作用、主要类型及定义方法。
主要是表述数据库中数据的正确性和相容性。
主要通过约束,规则,默认,触发器和存储过程来保证数据的完整性。
在此我们学习了数据库对象:约束,规则,默认,触发器和存储过程。
作用:1.数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据。
2.利用基于DBMS的完整性控制机制来实现业务规则,易于定义,容易理解,而且可以降低应用程序的复杂性,提高应用程序的运行效率。
同时,基于DBMS的完整性控制机制是集中管理的,因此比应用程序更容易实现数据库的完整性。
3.合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能。
比如装载大量数据时,只要在装载之前临时使基于DBMS的数据库完整性约束失效,此后再使其生效,就能保证既不影响数据装载的效率又能保证数据库的完整性。
4.在应用软件的功能测试中,完善的数据库完整性有助于尽早发现应用软件的错误。
主要类型:1.实体完整性,2.域完整性,3.参照完整性,4.用户自定义的完整性。
定义方法:实体完整性:要求表的每一行是唯一的实体。
通过建立唯一索引,unique,主键,identify约束来实现实体的完整性。
域完整性:指指定列中的数据具有正确的数据类型,格式和有效的数值范围。
通过默认值,外间,check 等约束及默认,规则等数据库对象来实现。
参照完整性要求两个表的主键和外键数据的一致。
2.总结SQL Server触发器的特点及创建语法。
特点:1、触发器是在对表进行增、删、改时,自动执行的存储过程。
触发器是一种高级约束,通过事件进行触发而被执行。
2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。
3、每个触发器将用到的两个临时表:deleted 临时表,inserted临时表deleted表和inserted表的特征:> 这两个表的表结构与该触发器作用的表相同;> 这两个表是逻辑表,并且由系统管理;> 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;> 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);4、所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。
所以,触发器是在约束检查之后才执行。
注意:create trigger必须是批处理(go)的第一条语句;一个触发器语句只能用到一个表或一个视图中;一个触发器语句可以执行多个操作;for delete,insert,update -- 无先后顺序的任意组合创建语法CREATE TRIGGER `<databaseName>(数据库名称)`.`<triggerName>(触发器名称)`< [ BEFORE | AFTER ](BEFORE触发器|AFTER触发器) >< [ INSERT | UPDATE | DELETE ](插入|更新|删除) >ON <tableName>(表名)FOR EACH ROW(每一行)AS BEGIN(开始)--do something(触发动作体)END(结束)教师评价实验态度 A. 很认真 B. 认真 C. 比较认真 D. 不认真独立完成情况 A. 很好 B. 好 C. 比较好 D. 不好收获和体会 A. 多 B. 比较多 C. 少 D. 很少思考题回答情况 A. 很好 B. 好 C. 比较好 D. 不好评阅教师:陈红顺日期:。