/*
【课外实验】
一、建立如下关系表
工程表(工程号,工程名,开工日期,竣工日期,状态,城市,项目经理号)
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
/*
三、是否能删除工程表的工程
*/