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

/*

【课外实验】

 

    一、建立如下关系表

 

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

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 

/*

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

*/

 

 

你可能感兴趣的:(各种数据仓库)