数据库第五次实验课

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档