任务需求
有如下四张表:
出勤
组
组类别
配置
1.更新[出勤_上班时长] 如果:"出勤"表,[出勤_上班时间]或者[出勤_下班时间],列发生改变所触发事件
- 更新上述两列 "出勤"表,出勤_上班时长 = 出勤_下班时间 - 出勤_上班时间
- 插入上述两列 "出勤"表,出勤_上班时长不插数据,插入完成后计算它。出勤_上班时长 = 出勤_下班时间 - 出勤_上班时间
2.插入 如果:"出勤"表,[出勤_日期],列发生改变所触发事件
插入 (配置_日期,组_名,组类别_名,组_号,组类别_号)
查询[a.出勤_日期,b.组_名,c.组类别_名,a.组_号,c.组类别_号]
创建表结构
根据给定的表结构,我们创建到数据库中
/*
时间:2018-12-26
作者:Lyven
需求:创建一个触发器,完成相应的更新和插入功能
*/
Use SQL_Road
CREATETABLE 出勤
(IDINTIDENTITY(1,1) NOTNULL PRIMARY KEY,
出勤_月份 INT ,
出勤_日期 INT ,
出勤_上班时间 VARCHAR(20),
出勤_下班时间 VARCHAR(20),
出勤_上班时长 VARCHAR(20),
组_号 VARCHAR(10)
)
CREATETABLE 组
(IDINTIDENTITY(1,1) NOTNULL PRIMARY KEY,
组_号 VARCHAR(10),
组_名 NVARCHAR(20),
组类别_号 VARCHAR(10),
组_人数 INT
)
CREATETABLE 组类别
(IDINTIDENTITY(1,1) NOTNULL PRIMARY KEY,
组类别_号 VARCHAR(10),
组类别_名 NVARCHAR(20),
组类别_时薪 NUMERIC(18,2)
)
CREATETABLE 配置
(IDINTIDENTITY(1,1) NOTNULL PRIMARY KEY,
配置_日期 INT,
组_名 VARCHAR(20),
组类别_名 NVARCHAR(20),
配置_工时 VARCHAR(20),
配置_工资 NUMERIC(18,2),
组_号 VARCHAR(10),
组类别_号 VARCHAR(10)
)
GO
插入测试数据
INSERTINTO 出勤(出勤_月份,出勤_日期,出勤_上班时间,出勤_下班时间,组_号)
VALUES
( 1, 12, 24, '7:30', '12:35', '01' ),
( 2, 12, 25, '8:00', '12:28', '01' ),
( 3, 12, 26, '8:30', '12:00', '01' )
INSERTINTO 组(组_号,组_名,组类别_号,组_人数)
VALUES
( '01', 'CAD', '01', 2 ),
( '02', 'MAX', '02', 1 ),
( '03', 'U3D', '03', 3 )
INSERTINTO 组类别(组类别_号,组类别_名,组类别_时薪)
VALUES
( '01', N'自动', 100.00 ),
( '02', N'员工', 200.00 ),
( '03', N'学员', 150.00 )
INSERTINTO 配置(配置_日期 , 组_名, 组类别_名, 配置_工资 ,
组_号, 组类别_号)
VALUES
( 24, 'CAD', N'自动', 12.50, '01', '01' ),
( 25, 'MAX', N'员工', 12.60, '02', '02' ),
( 26, 'U3D', N'学员', 12.70, '03', '03' )
分析需求
- 第一个需求其实是只要上班时间和下班时间,我们就自动给它算出这个时长,其实这样的需求在插入的时候就可以解决,这里我们不讨论这种优化方案,只是根据这个需求看该如何写出这个触发器。
- 第二个需求则是在日期发生变动的时候,需要对配置表插入一条数据
这样我们可以把这两个需求写在一个触发器当中。