数据库第五次实验课
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五数据库完整性
【实验目的】
1、掌握实体完整性约束、参照完整性约束
2、灵活应用自定义完整性约束
3、了解触发器在自定义完整性中的应用
【实验内容】
一、定义一个教师表Teacher(Tno,TName,TSex,TAge,TSal,TJob,TDept)
要求:
1、性别只能是‘男’或‘女’
2、Tno为主码,名字不能为空,且不能重复。
3、年龄在18在60岁之间
4、教授工资最低为5000(触发器完成)
5、所在系Tdept,为外码,参照于DEPT表(注:DEPT表需要预先定义,当DEPT表删除元组时,相对应Teacher元组拒绝删除;修改时,相对应Teacher元组同时修改)。
二、定义记录表Record(RNo,TNo,ROldSal,RNewSal,RUser,RTime)
要求:
1、RNo从1开始,每次加1为。主码
2、TNo为外码,参照Teacher表。
第一题和第二题参考:
[css] view plain copy print?
use sc --打开sc数据库
go
/*-------------创建系表-----------------------------*/
create table Dept
(TDeptchar(10) primary key);
go
/*-------------创建教师表---------------------------*/
create table Teacher
(TNochar(10) primary key,
TNamechar(10) not null,
TSex char(2)check(TSex in('男','女')),
TAgesmallintcheck(TAge>=18 and TAge<=60),
TSalnumeric(7,2),
TJobvarchar(10),
TDeptchar(10),
foreign key (TDept) references Dept(TDept)on delete no action on update cascade);
go
/*-------------创建记录表---------------------------*/
create table Record
(RNoint identity (1,1) primary key,
TNochar(10) references Teacher(TNo),
ROldSalnumeric(7,2),
RNewSalnumeric(7,2),RUser char(10), RTimeDatetime);
go
/*-----定义触发器教授工资不低于5000-------------------*/
create trigger Teacher_JiaoShou_MINSal
on Teacher
forInsert,Update as
setNocount off
/*---------定义变量----------------------------------*/
declare
@TNochar(10),
@NewSalnumeric(7,2),
@Tjobchar(10)
begin
/*---------获得变量值--------------------------------*/
select @TNo=TNo,
@NewSal=TSal,
@Tjob=Tjob
from inserted
/*---------判断是否是教授,且工资小于5000---------------*/
if (((@NewSal-5000)<0) and (@Tjob='教授'))
begin
/*---------修改该员工(教授Tno)表-------------------*/
update Teacher
setTsal=5000
whereTno=@Tno
end
end
go
三、定义触发器与触发器的执行
1、定义触发器Insert_Teacher,当插入Teacher一行元组时,会将该元组信息如:教师编号TNo,工资等信息,自动插入到表Record中(ROldSal为0)。
参考代码:
[xhtml] view plain copy print?
/*-----插入Teacher触发器-----------------*/
create trigger Insert_Teacher
on Teacher
for Insert as
setNocount off
/*---------定义变量----------------------*/
declare
@TNochar(10),
@RNewSalnumeric(7,2)
begin
/*---------获得变量值----------------------*/
select @TNo=TNo,
@RNewSal=TSal
from inserted
/*---------插入要记录的数据到Record表----------------------*/
insert into Record(TNo,ROldSal,RNewSal,RUser,RTime) values(@TNo,0,@RNewSal,current_user,current_timestamp)
end
测试数据
[c-sharp] view plain copy print?
insert into dept
values('信息工程系')
insert into teacher
values ('2008001','wang','男',34,2000,'讲师','信息工程系')
select * from teacher
2、定义触发器Update_Teacher,每当修改Teacher数据,且工资发生变动时,会自动记录工资变动情况到Record表。
参考代码:
[xhtml] view plain copy print?
/*-----更新Teacher触发器-----------------*/
create trigger Update_Teacher
on Teacher
for update as