触发器的作用是什么(触发器定义及5大作用)

抒情君 7

概述:

本章我们学习下,数据库高级应用触发器部分的知识!数据库完整性约束包含:实体完整性约束,域完整性约束,参照完整性约束,用户自定义完整性约束!

触发器的作用,主要用于满足参照完整性约束与用户自定义完整性约束!在这些领域的需求,我们都是可以通过触发器来实现,巧用触发器不仅可以提升项目开发效率,还可以满足很多特殊的需求,接下来让我们一探究竟!

什么是触发器?

触发器(Trigger)是一种维护数据完整性约束的手段,它是与表绑定的特殊的存储过程,基于事件的响应模式,符合触发器的设置条件,那么就会执行相应的代码!

触发器的特点是什么?

1:它是一种特殊的存储过程。

2:基于事件的响应模式。

3:具备事务的特性,可以保证数据的一致性,支持数据回顾操作。

4:它是一种高级约束,可以满足特殊的业务规则。

5:触发器的事件响应DML语句,例如:DELETE触发器、INSERT触发器、UPDATE触发器,当触发器绑定表之后,明确设置响应语句类型,那么当该表接受到DML语句中特定的操作,则会做出相应的响应。

触发器的执行步骤是什么?

触发器触发时,系统自动在内存中创建deleted表或inserted表,该表为临时只读类型,不允许修改;触发器执行完成后,则自动删除!

inserted 表 :临时保存了插入或更新后的记录行。deleted 表:临时保存了删除或更新前的记录行。

如何创建触发器?

createtriggerDemo_Triger--触发器名字onA--作用在哪张表中forinsert--针对操作类型AS--执行的业务操作脚本

接下来让我们实际操作一下,比如一张员工表有三个字段,工号、名字、性别,性别只能选择男或者女,这个需求属于自定义完整性约束,需要通过触发器来实现!

CREATETABLEEMPLOYEES
(
ENOINT,
ENAMEVARCHAR(20),
ESEXCHAR(2)
)CREATEtriggerEMPLOYEES_SexCheck_TrigeronEMPLOYEESforinsertASDECLARE@SEXCHAR(2)SELECT@SEX = ESEXFROMinserted--将插入的数据查询出来PRINT @SEXIF(@SEX <>男AND@SEX <>女)BEGINPRINT性别非法!ROLLBACKENDELSEBEGINPRINTNo Problem!ENDINSERTINTOEMPLOYEESSELECT1,张三,男;INSERTINTOEMPLOYEESSELECT2,里斯,女;INSERTINTOEMPLOYEESSELECT3,张三,它;

再来一个用触发器满足参照完整性约束的案例,一个员工表,一个工资表,两张表为一对多强耦合关系,员工离职需要删除员工信息,同时将工资信息也同步删除!

CREATETABLEEMPLOYEES
(
ENOINT,
ENAMEVARCHAR(20),
ESEXCHAR(2)
)CREATETABLEEMPLOYEES_Salary
(
esidintidentity,
ENOINT,
esmoney money,
esTime datetime
)SELECT*FROMEMPLOYEESASEMINNERJOINEMPLOYEES_SalaryASESONEM.ENO = ES.ENO

在员工表上创建删除的触发器:

CREATEtriggerEMPLOYEES_DELETE_TrigeronEMPLOYEESfordeleteASDECLARE@ENOint--将保存在deleted临时表中的数据查询出来SELECT@ENO = ENOFROMdeleted--同步删除子表数据DELETEFROMEMPLOYEES_SalaryWHEREENO = @ENODELETEFROMEMPLOYEESWHEREENO =3

接下来综合实战一波,需求每次更新Test表,保存更新前的记录,将记录信息保存到更新日志表Test_Log中,最后将第一次更新的数据,更新回Test表中!

CREATETABLETest(idint,namevarchar(20)
)CREATETABLETest_log
(
tidintidentity,idint,namevarchar(20),
createtime datetime
)INSERTINTOTESTSELECT1,AINSERTINTOTESTSELECT2,BINSERTINTOTESTSELECT3,CCREATEtriggerTest_Update_TrigeronTestforupdateASDECLARE@idint,@namevarchar(20)--将保存在deleted临时表中的数据查询出来SELECT@id=id,@name=nameFROMdeleted--同步到Test_Log日志表INSERTINTOTest_logSELECT@id,@name,getdate()SELECT*FROMTestUPDATETESTSETNAME=A1WHEREID=1;UPDATETESTSETNAME=A2WHEREID=1;UPDATETESTSETNAME=A3WHEREID=1;UPDATETESTSETNAME=B1WHEREID=2;UPDATETESTSETNAME=B2WHEREID=2;UPDATETESTSETNAME=C1WHEREID=3;UPDATETESTSETNAME=C2WHEREID=3;UPDATETESTSETNAME=C3WHEREID=3;UPDATETESTSETNAME=C4WHEREID=3;SELECT*FROMTESTASTINNERJOINTEST_LOGASTLONT.id = TL.id

每次更新都会触发触发器,保存我们的更新日志记录,满足我们对于参照完整性约束的需求,接下来我们通过SQL,让Test表中的数据,重新回到初始状态。

--STEP 1SELECTMIN(createtime)ascreatetimeFROMTest_logGROUPBYid--STEP 2SELECTid,name,createtimeFROMTest_logWHEREcreatetimeIN(SELECTMIN(createtime)ascreatetimeFROMTest_logGROUPBYid)--STEMP 3UPDATETESTSETNAME= T2.nameFROMTESTAST1INNERJOIN(SELECTid,name,createtimeFROMTest_logWHEREcreatetimeIN(SELECTMIN(createtime)ascreatetimeFROMTest_logGROUPBYid)

)AST2ONT1.id = T2.idSELECT*FROMTEST

总结一下:

以上就是关于触发器相关的知识,通过案例的深入,应该可以理解,并且掌握触发器的应用了!

喜欢的小伙伴可以关注我,一起交流学习!我是IT鸟叔,一位喜欢写程序、钓鱼、喝茶、玩游戏的中年大叔!

上一篇:

下一篇:

  推荐阅读

分享