create table 部门( 部门名称 CHAR(50) NOT NULL primary key, 部门负责人 CHAR(50) NOT NULL, 部门人数 CHAR(50) );
create table 员工(
工号 CHAR(50) NOT NULL primary key, 姓名 CHAR(50) NOT NULL,
性别 CHAR(2) DEFAULT'男'CHECK(性别 IN('男','女')), 年龄 CHAR(10) NOT NULL, 籍贯 VARCHAR(50) NOT NULL,
身份证号 CHAR(50) UNIQUE NOT NULL, 婚姻情况 CHAR(50), 学历 CHAR(50),
部门名称 CHAR(50) NOT NULL, 工种 CHAR(50),
工龄 CHAR(4) NOT NULL, 职务等级 CHAR(50) );
CREATE TABLE 工资(
工号 char(50) not null primary key, 工资年月 char(50) not null , 岗位工资 decimal not null, 岗位补贴 decimal,
出勤天数 decimal not null, 加班工时 decimal, 加班工资 decimal, 加班天数 decimal, 加班类别 char(50), 病假扣款 decimal, 事假扣款 decimal, 其他扣款 decimal, 应发工资 decimal,
实发工资 decimal not null,
foreign key (工号) references 员工(工号)); alter table 工资
add constraint CK_gongho check(工号>0);
create table 系统用户
(用户名 char(50) primary key, 用户权限 char(50), 用户密码 char(10),)
create table 工龄工资 (
工龄 char(4) primary key, 工龄工资 float(8)not null);
create table 员工登陆密码 (
工号 CHAR(50) primary key, 密码 char(6),
foreign key(工号) references 员工(工号)); alter table 员工登陆密码
add constraint CK_gongh check(工号>0);
(三)视图
(1)查询员工工资情况
建立一个视图,反映员工姓名及工资情况。
CREATE VIEW 员工_工资
AS
SELECT 员工.姓名, 工资.* FROM 员工,工资
WHERE 员工.工号=工资.工号
(四)存储过程
(1)指定员工工资情况的查询
定义一个名为stsffCost的存储过程,该存储过程以以工资年月(@staffgongzi)、出勤天数(@staffchuqin)、加班工资(@staffjiaban)、应发工资(@staffying)、实发工资(@staffshi)为输入参数返回指定员工工资信息的存储过程。 stsffCost代码如下:
CREATE PROCEDURE staffCost @staffgongzi decimal, @staffchuqin decimal, @staffjiaban decimal, @staffying decimal, @staffshi decimal AS
SELECT * FROM 工资
WHERE 工资年月=@staffgongzi AND 出勤天数=@staffchuqin AND 加班工资=@staffjiaban AND 应发工资=@staffying AND 实发工资=@staffshi GO
(2)指定范围的员工的信息查询。 以员工工号、部门编号为输入参数返回指定员工基本信息的存储过程,要求输入部分员工信息查询员工全部信息。
定义一个名为stsffInfo的存储过程,该存储过程以员工工号(@staffNum)、部门编号(@bmNum)作为输入参数,存储过程返回查询到的结果集。
satffInfo的定义代码如下:
CREATE PROCEDURE staffInfo @staffNum VARCHAR(50)='%', @bmNum VARCHAR(50)='%' AS
SELECT *
FROM 员工,部门
WHERE 员工.部门名称=部门.部门名称 AND
((员工.工号 LIKE @staffNum VARCHAR(50)+'%') AND (部门编号 LIKE @bmNum VARCHAR(50)+'%')) GO
(3)统计指定年份各部门每个月份的工资总额。
以年份为输入参数,以总工资金额为输出参数,产生该年度12个月份的每部门工资统计的存储过程。定义该存储过程名为bmMonhSum,输入参数为@ThisYear,实现代码如下:
CREATE PROCEDURE bmMonthSum @ThisYear CHAR(10) AS
SELECT DATEPART(MM,工资年月) AS 员工工资月份,SUM(实发工资) AS 部门人数 FROM 员工,工资,部门
WHERE 员工.工号=工资.工号 AND 员工.部门名称=部门.部门名称 AND DATEPART(YYYY,工资年月)=@ThisYear
GROUP BY DATEPART(MM,工资年月) GO
(五)触发器
(1)关键操作,在工资表里添加一条新的记录,实发工资会自动更新新的数据。定义这个触发器名称为insert_工资。 代码如下:
create trigger insert_工资 on 工资 for insert as
declare @i char(20) declare @bb int set @i=case
when @bb=0001 then '实发工资' when @bb=0002 then '实发工资' end
print @i
(2)员工新调入
进行员工新调入操作是在员工信息表中添加一条新的记录,可以为员工信息表设计一个Insert触发器,当员工信息表执行Insert操作后自动更改出部门信息表相应记录的数据。定义这个触发器名称为staff_insert。 其代码如下:
CREATE TRIGGER staff_insert ON 员工 FOR INSERT
AS IF (SELECT COUNT(*)
FROM 部门,inserted,工资
WHERE 部门.部门人数=inserted.部门人数 AND 工资.工号=inserted.工号)=0 ROLLBACK TRANSACTION GO
(3)员工调出
进行员工调出操作是在员工信息表中删除该员工的记录,可以为员工信息表设计一个Delete触发器,当员工信息表执行Delete操作后,工资表、部门表中的记录也将全部删除。定义这个触发器名称为staff_delete。 其实现代码如下:
CREATE TRIGGER staff_delete ON 员工 FOR DELETE
AS SELECT COUNT(*)
FROM 部门,工资,deleted
WHERE 部门.部门人数=deleted.部门人数 AND 工资.工号=deleted.工号 GO
(4)员工内部调动
为员工表设计一个名为staff_update的UPDATE触发器,当系统对员工表进行UPDATE操作后,将会自动触发它。该触发器将相应记录的部门人数、部门名称、工资更新。
下面是client_update触发器的定义代码; CREATE TRIGGER staff_update ON 员工 FOR UPDATE
AS SELECT COUNT(*)