广东工业大学数据库实验.docx
《广东工业大学数据库实验.docx》由会员分享,可在线阅读,更多相关《广东工业大学数据库实验.docx(19页珍藏版)》请在冰豆网上搜索。
![广东工业大学数据库实验.docx](https://file1.bdocx.com/fileroot1/2023-5/28/13a7c377-3470-43e8-bd6c-a76740b9b0a1/13a7c377-3470-43e8-bd6c-a76740b9b0a11.gif)
广东工业大学数据库实验
课程实验
课程名称_数据库课程实验___
题目名称_数据库完整性与安全性_
学生学院_______计算机_________
专业班级____网络工程一班_______
学号____3109006466_________
学生姓名________韩江___________
指导教师_______郝彦军_________
2012年6月
目录
一、实验目的2
二、实验平台……………………………………………………………………………………………………….4
1、硬件............................................................................................................................................................4
2、操作系统...................................................................................................................................................4
3、数据库管理系统:
..................4
4、可视化管理工具:
...................................................................................................................................4
三、数据库完整性概述………………………………………………………………………………………….4
1、数据库完整性概念......................................................................................................................................4
2、Oracle的完整性技术综述..........................................................................................................................4
四、实验内容2
【例1】2
【例2】4
【例3】4
【例4】6
【例5】7
【例6】8
【例7】8
【例8】9
【例9】10
【例10】11
【例11】13
【例12】14
【例13】14
【例14】14
【例15】15
【例16】15
【例17】16
【例18】16
【例19】17
【例20】19
【例21】20
五、实验总结20
一、实验目的
填写参考实验三指导书
二、实验平台
1、硬件:
AMD4核
2、操作系统:
redhat5.4
3、数据库管理系统:
oracle10gR2
4、可视化管理工具:
Shell
填写实验一的结果
三、数据库完整性概述
1、数据库完整性概念
……
2、Oracle的完整性技术综述
……
4、实验内容
连接数据库成功
【例1】将Student表中的Sno定义为主码
在列级定义主码
createtableStudent
(Snochar(9)primarykey,
Snamechar(20)notnull,
Ssexchar
(2),
Sagesmallint,
Sdeptchar(20)
);
在表级定义主码
createtableStudent
(Snochar(9),
Snamechar(20)notnull,
Ssexchar
(2),
Sagesmallint,
Sdeptchar(20),
primarykey(Sno)
);
【例2】将SC表中的Sno,Cno属性组定义为码
对于属性组,只能在表级定义主码
createtableSC
(Snochar(9)notnull,
Cnochar(4)notnull,
Gradesmallintnotnull,
primarykey(Sno,Cno)
);
【例3】定义SC表中的参照完整性
createtableSC
(Snochar(9)notnull,
Cnochar(4)notnull,
Gradesmallint,
primarykey(Sno,Cno),
foreignkey(Sno)referencesStudent(Sno),
foreignkey(Cno)referencesCourse(Cno)
);
【例4】显式说明参照完整性的违约处理示例
createtableSC
(Snochar(9)notnull,
Cnochar(4)notnull,
Gradesmallint,
primarykey(Sno,Cno),
foreignkey(Sno)referencesStudent(Sno)
ondeletecascade
onupdatecascade,
foreignkey(Cno)referencesCourse(Cno)
ondeletenoaction
onupdatecascade
);
操作失败!
原因:
oracle中不支持onupdatecascade操作。
【例5】在定义SC表时,说明Sno,Cno,Grade属性不能取空值。
createtableSC
(Snochar(9)notnull,
Cnochar(4)notnull,
Gradesmallintnotnull,
primarykey(Sno,Cno)
);
【例6】建立部门表DEPT,要求部门名称Dname列值取唯一,部门编号Deptno列为主码。
createtableDEPT
(Deptnonumeric
(2),
Dnamechar(9)unique,
Locationchar(10),
primarykey(Deptno)
);
【例7】Student表的Ssex只允许取’男’或’女’。
createtableStudent
(Snochar(9)primarykey,
Snamechar(8)notnull,
Ssexchar
(2)check(Ssexin('男','女')),
Sagesmallint,
Sdeptchar(20)
);
【例8】SC表中的Grade的值应该在0和100之间。
createtableSC
(Snochar(9)notnull,
Cnochar(4)notnull,
Gradesmallintcheck(Grade>=0andGrade<=100),
primarykey(Sno,Cno),
foreignkey(Sno)referencesStudent(Sno),
foreignkey(Sno)referencesCourse(Cno)
);
【例9】当学生的性别是男时,其名字不能以Ms.开头。
createtableStudent
(Snochar(9),
Snamechar(8)notnull,
Ssexchar
(2),
Sagesmallint,
Sdeptchar(20),
primarykey(Sno),
check(Ssex='女'orSnamenotlike'Ms.%')
);
【例10】建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是’男’或’女’。
createtableStudent
(Snonumeric(6)
constraintc1check(Snobetween90000and99999),
Snamechar(20)
constraintc2notnull,
Sagenumeric(3)
constraintc3check(Sage<30),
Ssexchar
(2)
constraintc4check(Ssexin('男','女')),
constraintStudentKeyprimarykey(Sno)
);
【例11】建立教师表TEACHER,要求每个教师的应发工资不低于3000元。
应发工资就是实发工资列Sal与扣除项Deduct之和。
createtableTEACHER
(Enonumeric(4)primarykey,
Enamechar(10),
Jobchar(8),
Salnumeric(7,2),
Deductnumeric(7,2),
Deptnonumeric
(2),
constraintEMPFkeyforeignkey(Deptno)referencesDEPT(Deptno),
constraintccheck(Sal+Deduct>=3000)
);
【例12】去除【例10】Student表中对性别的限制。
altertableStudentdropconstraintc4;
【例13】修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄小于30改为小于40。
可先删除原来的约束条件,再增加新的约束条件。
altertableStudentdropconstraintc1;
【例14】建立一个性别域,并声明性别域的取值范围。
createdomainGenderDomainchar
(2)
check(valuein('男','女'));
创建失败!
原因:
Oracle不支持创建域,域是指属性的取值范围。
方法:
oracle也不支持枚举类型ENUM。
但是可以用check来对属性的值进行约束。
下面使用check建造一个例子:
createtableStudent
(Snonumeric(6)primarykey,
Snamechar(20)notnull,
Ssexchar
(2)check(Ssexin('男','女'))
);
【例15】建立一个性别域GenderDomain,并对其中的限制命名。
createdomainGenderDomainchar
(2)
constraintGDcheck(valuein(‘男’,’女’));
该语句不能执行,oracle不支持域的建立!
回看【例14】结论。
【例16】删除域GenderDomain的限制条件GD.
alterdomainGenderDomain
dropconstraintGD;
该语句不能执行,oracle不支持域的建立!
回看【例14】结论。
【例17】在GenderDomain上增加限制条件GDD.
alterdomainGenderDomain
addconstraintGDDcheck(valuein(‘1’.’0’));
该语句不能执行,oracle不支持域的建立!
回看【例14】结论。
【例18】定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。
createtriggerInsert_Or_Update_Sal
beforeinsertorupdateonTeacher
foreachrow
asbegin
if(new.Job='教授')and(new.Sal<4000)then
new.Sal:
=4000;
endif;
end;
创建失败!
原因:
1、oracle语法不支持在建立触发动作体之前加上’AS’字符。
2、oracle在新建的变量前需要加:
,如:
new.job=’教授’。
把书本例子修改如下:
createorreplacetriggerupdate_sall
beforeupdateonteacher
foreachrow
begin
if(:
new.job='教授')and(:
new.sal<4000)then
:
new.sal:
=4000;
endif;
end;
/
【例19】定义AFTER行级触发器,当教师表Teacher的工资发生变化后就自动在工资变化表Sal_log中增加一条相应记录。
首先建立工资变化表。
createtableSal_log
(Enonumeric(4)referencesteacher(Eno),
Salnumeric(7,2),
Usernamechar(10),
Datestimestamp
);
课本中修改语法后的例子:
createorreplacetriggerInsert_sal
afterinsertonTeacher
foreachrow
begin
insertintoSal_log(eno,sal,username,dates)values(
:
new.Eno,:
new.Sal,user,sysdate);
end;
/
课本中修改语法后的例子:
createtriggerUpdate_Sal
afterupdateonTeacher
foreachrow
begin
if(:
new.Sal<>:
old.Sal)theninsertintoSal_logvalues(
:
new.Eno,:
new.Sal,user,sysdate);
endif;
end;
【例20】执行修改某个教师工资的SQL语句,激活上述定义的触发器。
updateTeachersetSal=800whereEname=’陈平’;
先向Teacher表中插入一条记录:
insertintoTeachervalues(1234,’陈平’,’程序员’,400.00,null,null);
然后在更改某个教师工资的SQL语句测试:
【例21】删除教师表Teacher上的触发器Insert_Sal。
droptriggerInsert_SalonTeacher;
操作失败!
原因:
Oracle删除触发器的SQL语法形如:
droptrigger触发器名;
如:
droptriggerinsert_sal;
五、实验总结
1、不能通过测试的例子:
【例4】【例14】【例15】【例16】【例17】【18】【19】【21】
2、结论
在数据库完整性方面,oracle数据管管理系统对标准SQL不完全支持。
如:
Oracle中不支持onupdatecascade操作。
Oracle不支持创建域,也不支持枚举类型ENUM。
但是可以用check来对属性的值进行约束。
Oracle语法不支持在建立触发动作体之前加上’AS’字符,oracle在新建的变量前需要加:
,如:
new.job=’教授’。
Oracle删除触发器的SQL语法形如:
droptrigger触发器名。