SQL中如何使用触发器,实现简单的触发功能?(二)

简介: 最近有小伙伴向我请求帮助,要写一个触发器。我看了一下需求很明确,就是执行更新,插入后触发一些事件。觉得挺有意思的,于是帮他写了一下,这里分享给大家。

需求代码

CREATETRIGGER T_出勤  --创建 触发器
ON 出勤
AFTERUPDATE,INSERT  
--一个触发器可以同时写更新插入和删除等动作
AS
BEGIN
--定义变量
DECLARE @IDINT;
DECLARE @出勤_上班时间 VARCHAR(20);
DECLARE @出勤_下班时间 VARCHAR(20);  
DECLARE @出勤_日期 INT;

--更新  出勤_上班时长
IF (UPDATE (出勤_上班时间) ORUPDATE (出勤_下班时间) )
--如果出勤_上班时间和出勤_下班时间发生了更新动作,则执行如下代码
BEGIN
--先获取更新后的值保留在变量中,其中inserted表为系统表,存放更新后的值
SELECT
@ID=ID,
@出勤_上班时间=出勤_上班时间,
@出勤_下班时间=出勤_下班时间
FROM inserted;
--将变量传入到表中,使取到的值唯一,对出勤_上班时长进行更新
UPDATE 出勤 SET 出勤_上班时长=
CONVERT(varchar(100) , DATEADD(ss, DATEDIFF(ss, 出勤_上班时间, 出勤_下班时间), 0), 108)
WHEREID=@ID
AND (出勤_上班时间=@出勤_上班时间
OR 出勤_下班时间=@出勤_下班时间);
END

--插入配置信息
IFUPDATE (出勤_日期)
--当出勤_日期发生了变动,我们执行如下更新。
BEGIN
--获取更新后的值传给变量
SELECT
@ID=ID ,
@出勤_日期=出勤_日期
FROM inserted;
--执行插入操作
INSERTINTO  配置(配置_日期,组_名,组类别_名,组_号,组类别_号)
SELECT
a.出勤_日期,b.组_名,c.组类别_名,a.组_号,c.组类别_号
FROM 出勤 a
JOIN 组 b ON a.组_号 = b.组_号
JOIN 组类别 c ON b.组类别_号 = c.组类别_号
WHERE a.ID=@ID
AND  a.出勤_日期=@出勤_日期  
END  
END


代码解读

1、触发器的语法这个必须掌握,本案例是在SQL Server下执行的,其他关系数据库的语法可能不同,请注意一下。

2、触发器中可以实现多种不同的操作,更新,删除,插入均可写在一个触发器上,当然要视情况而定

3、触发器在执行时会将更新前的数据存放在临时表deleted中,在更新后会将数据存放在临时表inserted中,这里我们就用到了临时表inserted

4、在更新上班时长时用到了时间处理函数DATEDIFF和DATEADD,两个函数是比较常用的时间处理函数,必须掌握。

5、参数传递是代码中比较重要一环,我们是先将临时表中的数据存放在一个变量中保存,在我们真正进行更新或插入操作时候再把这个变量取出来使用,就是将变量再次传递给条件语句。


测试功能

1、在测试数据之前,我们先看看出勤表和配置表中的数据

出勤

45.jpg


我们看到出勤_上班时长是没有数据的,下面我们开始更新

UPDATE 出勤 SET 出勤_上班时间='7:00'
WHEREID=1

执行完后我们再看出勤表中的数据是否有变化

46.jpg

从上图可以看出,结果符合我们预期,同理更新下班时间也会对上班时长进行更新操作,这里就不演示了。

2、我们插入数据是否也会更新上班时长呢?我们执行如下语句

INSERTINTO 出勤(出勤_月份,出勤_日期,
出勤_上班时间,出勤_下班时间,组_号)
VALUES (12,11,'8:30','12:00','01')

执行完后我们查看一下结果

47.jpg


结果也符合我们的预期。


3、当出勤表中的日期被更新的时候,配置表里是否会插入了一条数据?我们先看看配置表中的数据

48.jpg

我们对出勤表中的日期进行更新操作,看配置表会不会多一条记录?

UPDATE dbo.出勤 SET 出勤_日期='22'
WHEREID=2

更新后我们看看配置表中的数据


49.jpg

结果也符合我们的预期。


总结

整个案例其实精华部分就只是触发器部分,但是为了让小伙伴们能更加清晰的阅读和思考,故将整个案例从需求到测试都给大家展现出来。而触发器部分如果对其语法比较了解,使用起来并没有想象的那么难。当然其中有一些小技巧还是需要大家去了解一下,就比如将更新和插入操作写在一个触发器是可以的。我们也可以指定只有哪几列发生更新操作的时候才执行相应的语句。最后,如果你有一些比较经典的需求,也可以发送给我,兴许下次展示的就是你的案例啦!

相关文章
|
2月前
|
SQL 运维 关系型数据库
一款 SQL 自动检查神器,再也不用担心 SQL 出错了,自动补全、回滚等功能大全
一款 SQL 自动检查神器,再也不用担心 SQL 出错了,自动补全、回滚等功能大全
34 0
|
1月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
43 6
|
17天前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
56 0
|
25天前
|
SQL 分布式计算 DataWorks
MaxCompute产品使用问题之如何通过临时查询功能来书写和运行SQL语句
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
SQL 存储 关系型数据库
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
MySQL的触发器创建与使用——使用Baidu Comate生成与触发测试完整过程
16 0
|
1月前
|
运维 Serverless API
Serverless 应用引擎产品使用合集之哪里添加函数计算触发器能够触发某个函数work
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2月前
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
|
2月前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
57 1
|
2月前
|
SQL Java 数据库连接
Mybatis之Mybatis的各种查询功能和特殊SQL的执行
【1月更文挑战第3天】 一、MyBatis的各种查询功能 1、查询一个实体类对象 2、查询一个List集合 3、查询单个数据 4、查询一条数据为map集合 5、查询多条数据为map集合 1、方法一 2、方法二 二、特殊SQL的执行 1、模糊查询 2、批量删除 3、动态设置表名 4、添加功能获取自增的主键
154 1
Mybatis之Mybatis的各种查询功能和特殊SQL的执行
|
2月前
|
SQL 存储 数据库
PL/SQL触发器的概述和用途
PL/SQL触发器的概述和用途
46 2