【机房重构】——触发器

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 【机房重构】——触发器

在耿建玲视频中就学习了触发器这个知识点,但是当时没有认真的学习者块知识,只知道触发器是当我们对数据库中的表进行操作的时候,自动触发执行sql语句,但是到底是怎么使用?以及基本语法是什么都不是很清楚,所以在第一遍机房的时候也没有用触发器,因为当时发扬了“重复就是力量”的精神,都是一遍一遍的写重复的代码。可是在重构的时候比较懒,不愿意写那些重复的代码,所以就对这个只是小研究了一下,下面和大家分享一下:


基本概念:


触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发当我们对表进行 增(Add)、删(Delete)、改(Update)操作时,自动执行我们预先写好的sql语句(可以包含复杂的sql语句)。


分类:


1、DML触发器


当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。


2、DDL触发器


它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。


3、登录触发器


登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。


第一类触发器是我们经常用到的一类,下面我就结合机房收费系统给大家介绍一下触发器的基本语法和用法。


当我们充值和退卡的时候,我们不单要增加充值表和退卡表中的记录,同时我们需要更新学生表中的余额,这样我们就可以用触发器轻松实现,代码如下:


-- =============================================
-- Author:  郑浩
-- Create date: 2014-12-26
-- Description: 当充值的时候更新学生表中的余额
-- =============================================
ALTER TRIGGER [dbo].[Recharge] ’ 触发器名称
   ON  [dbo].[ZH_RechargeInfo]  ’作用于那个表
   AFTER INSERT               '执行 插入操作
AS 
BEGIN  
    --引发操作:向注册表和充值表中插入数据  
    update ZH_StudentInfo set Cash=cash+(select RechargeCash from inserted) where CardNo=(select CardNo from inserted)
END

大家可能注意到在代码中有这样一个"inserted"东西,这个一个虚拟表来存放我们刚插入的数据,这样我们就可以从这个虚拟表中获取刚插入的数据。Update型触发器和Insert非常相似,在这就不在列举实例。


下面来看一下delete型的触发器,当值班教师下班的时候,我们需要从正在值班教师表中删除这条数据,同时在值班记录表中插入数据,下面来看一下代码:


ALTER TRIGGER [dbo].[Trigger_OnWorkLog]
   ON  [dbo].[ZH_OnWorkInfo]
   AFTER delete               ’当执行delete操作时激活触发器
AS 
  declare @LoginDate date,      ’声明变量
          @LoginTime varchar(50),
          @LogoutDate date,
          @LogoutTime varchar(50),
          @Status varchar(50),
          @WorkComputer varchar(50),
          @UserID varchar(50)
          select @UserID=UserID FROM deleted
          select @LoginDate =LoginDate from deleted
          select @LoginTime = LoginTime from deleted
          select @WorkComputer=WorkComputer from deleted
          set @LogoutDate =CONVERT (varchar (10),GETDATE (),120)   --获取日期  
          set @LogoutTime =CONVERT (varchar (10),GETDATE (),108)   --获取时间 
          set @Status = '未值班'
BEGIN
  -- 引发操作
  insert into ZH_WorkLogInfo(UserID,LoginDate,LoginTime,LogoutDate,LogoutTime,Status,WorkComputer) values(@UserID,@LoginDate,@LoginTime,@LogoutDate,@LogoutTime,@Status,@WorkComputer)
EN

大家可以看到在上面的代码中有这样一个“deleted”单词,这也是一个虚拟表用来存放我们刚刚删除的数据,它的机制是这样的,当我们执行删除操作的时候,它会将要删除的数据存放在这张虚拟表中,当触发器执行完成后,在将数据从虚拟表中彻底删除。


优点:


我们都知道数据库中的约束只能是对于一张表中的数据进行约束,而触发器可以执行复杂的sql语句实现级联修改,并且可以强制用比CHECK约束定义的约束更为复杂的约束,这样更是对表的操作更加简单和灵活。


小结


在我们重构的时候应该有一种新的思路,尽可能的用不同的方法来实现要求,不能在延续第一遍机房的思想,如果那样我们的重构就没有意思了,应该加入一些新鲜血液,让我们在前面学的更多的理论知识用于到实践中。

在下一篇博客将结合机房来浅析一下存储过程。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
存储 安全 数据库
【机房重构】—触发器经营离婚事务所
所以一定要再去离婚事务所的时候想清楚了(慎用触发器);如果你没有任何思考而是一时的冲动贸然去离婚事务所办理了离婚手续,必然会后悔终身(对于触发器的过分依赖,势必影响数据库的结构,同时增加了维护的复杂程度)。
|
存储 SQL 数据库
【机房重构】——存储过程和触发器
【机房重构】——存储过程和触发器
155 0
【机房重构】——存储过程和触发器
|
5月前
|
存储 关系型数据库 MySQL
MySQL触发器实战:自动执行的秘密
MySQL触发器实战:自动执行的秘密
96 3
|
5月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
5月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
4月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
4月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
5月前
|
SQL 存储 关系型数据库
MYSQL--触发器
MYSQL--触发器
|
5月前
|
存储 SQL 关系型数据库
MySQL周内训参照4、触发器-插入-修改-删除
MySQL周内训参照4、触发器-插入-修改-删除
41 1