您的位置:首页 > 数据库

实验五数据库完整性 课外练习题答案

2010-11-20 09:09 489 查看
/*

【课外实验】



一、建立如下关系表



工程表(工程号,工程名,开工日期,竣工日期,状态,城市,项目经理号)

TProject(Pid,PName,PStartDate,PEndDate,PStatus,PCity,Wid)

职工表(职工号,姓名,年龄,籍贯,职称,基本工资)

TWorker(Wid,WName,WAge,WHome,WRank,WBaseSal)

岗位表(岗位号,岗位名)

TJob(Jid,JName)

工资表(序号,职工号,月份,绩效工资,奖金)

TSalary(Sid,Wid,SMonth,SPerformanceSal,bonuses)

要求:

1、籍贯只记城市。

2、正确确定四个表的主码

3、通过外码,正确把握关系间的联系

4、工程与职工具有多对多的联系,建立一个工程_职工表(工程号,职工号,岗位号,入职时间,状态)

5、工程表的状态有两种状态(0:未完工,1:已完工)

工程_职工表的状态有两种(0:在职,2:已离职)

6、工资表的月份只能取1-12,奖金只能取100的倍数

7、职工表的年龄取值范围是18-60;职称取值为:初级、中级、高级;

要求所有人员基本工资不低于800,高级人员的基本工资不低于4500.

*/

Create Database ProjectDB;
go
use ProjectDB;
go


/*

职工表(职工号,姓名,年龄,籍贯,职称,基本工资)

TWorker(Wid,WName,WAge,WHome,WRank,WBaseSal)

*/

Create Table TWorker(
Wid char(10) primary key,
WName char(10) not null, 
WAge int check(WAge>=18 and WAge<=60),
WHome char(100),
WRank char(10) check(WRank in ('初级','中级','高级')),
WBaseSal numeric(7,2),
check((WRank='高级' and WBaseSal>=4500) or (WRank<>'高级' and WBaseSal>=800) ) /* 也可以用触发器解决,见下 */
);


go

/* 保证插入到数据库中的基本工资满足:所有人员基本工资不低于800,高级人员的基本工资不低于4500. */

Create Trigger BaseSalaryEnsure
On TWorker
For insert,update
As 
set Nocount off
Declare
@Wid char(10),
@WRank char(10),
@WBaseSal numeric(7,2)
Begin
select @Wid=Wid,@WBaseSal=WBaseSal
from inserted;
if(@WRank='高级' and @WBaseSal<4500)
Begin
select @WBaseSal=4500
End;
if(@WBaseSal<800)
Begin
select @WBaseSal=800
End;
update TWorker set WBaseSal=@WbaseSal where Wid=@Wid;
End;
go


/*

工程表(工程号,工程名,开工日期,竣工日期,状态,城市,项目经理号)

TProject(Pid,PName,PStartDate,PEndDate,PStatus,PCity,Wid)

*/

Create Table TProject(
Pid char(10) primary key,
PName char(50) not null,
PStartDate Date,/*check(PStartDate<=PEndDate), 表 'TProject' 的列 'PStartDate' 的列 CHECK 约束引用了另一列。*/
PEndDate Date,
PStatus bit, /* 工程表的状态有两种状态(0:未完工,1:已完工) */
PCity char(10),
Wid char(10),
foreign key(Wid) references TWorker(Wid),
check(PStartDate<=PEndDate)
);


go

/* 确定日期合理性 */

Create Trigger ValidateDate
On TProject
For Insert,Update
As
Set Nocount off
Declare
@Pid char(10),
@PSDate Date,
@PEDate Date
Begin
select @Pid=Pid,@PSDate=PStartDate,@PEDate=PEndDate
from inserted
/* 如果工程开始日期小于竣工日期,则开始日期等于竣工日期 */
if(@PSDate>@PEDate)
Begin
update TProject set PStartDate=@PEDate where Pid=@Pid;
End;
End;
go


/*

岗位表(岗位号,岗位名)

TJob(Jid,JName)

*/

Create Table TJob(
Jid char(10) primary key,
JName char(10)
);


/*

工资表(序号,职工号,月份,绩效工资,奖金)

TSalary(Sid,Wid,SMonth,SPerformanceSal,Sbonuses)

*/

Create Table TSalary (
Sid char(10) primary key,
Wid char(10) references TWorker(Wid),
SMonth int check(SMonth>=1 and SMonth<=12),
SPerformanceSal numeric(7,2),
Sbonuses numeric(7,2)
);


/*

工程_职工表(工程号,职工号,岗位号,入职时间,状态)

TProject_Worker(Pid,Wid,Jid,EntryTime,PWStatus)

*/

Create Table TProject_Worker(
Pid char(10),
Wid char(10),
Jid char(10),
EntryTime datetime,
PWStatus int check (PWStatus=0 or PWStatus=2),
foreign key(Pid) references TProject(Pid),
foreign key(Wid) references TWorker(Wid),
foreign key(Jid) references TJob(Jid)
);




/*

二、创建视图工资视图(序号,职工号,月份,基本工资,绩效工资,奖金,[五险一金],应发,个人所得税,实发)

*/

go
Create View 工资视图 
As (
select 
Sid as 序号,
TSalary.Wid as 职工号, 
SMonth as 月份,
TWorker.WBaseSal as 基本工资,
Sbonuses as 资金,
500 as 五险一金,
TWorker.WBaseSal+Sbonuses as 应发,
(TWorker.WBaseSal+Sbonuses)*0.05 as 个人所得税,
TWorker.WBaseSal+Sbonuses-(TWorker.WBaseSal+Sbonuses)*0.05 as 实发
from TSalary,TWorker
where TSalary.Wid=TWorker.Wid
)
go


/*

三、是否能删除工程表的工程

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: