008 数据库学习笔记--触发器

发布时间 2023-06-08 11:34:49作者: sunwugang

主要内容来自:

https://blog.csdn.net/KingCruel/article/details/106292310

https://blog.csdn.net/qq_36330228/article/details/90582493

触发器:

触发器,可理解为一种特殊的存储过程。是一个特殊的事务(在执行过程中,可执行一些检查或设置条件,不满足时,可回滚操作)

存储过程,通过存储过程名称来调用执行;触发器,通过事件触发--自动调用执行;

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,

它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器分类:

  • DDL触发器:(数据定义语言,Data Definition Language) 例如,create\alter\drop
  • DML触发器:(数据操作语言,Data Manipulation Language) 例如,insert\update\delete
    • 操作完成后触发器:insert\update\delete
    • insted of 触发器:只执行触发器本身,不执行其他定义的操作(insert\update\delete)

触发器语句中使用了两种特殊的表:deleted 表和 inserted 表

DML触发器执行时,系统内存会自动生成deleted表或inserted表,执行结束会自动消失。

SQL Server 有3类触发器【触发器是在对应表的下面】

Sql server中这三类触发器总是在执行操作语句后才被自动调用

  •    Insert触发器,使用到inserted表——Insert:向数据表插入数据时,调用insert触发器
  •    Update触发器,使用到deleted表和inserted表——Update:更新数据时调用update触发器
  •    Delete触发器,使用到deleted表——Delete:删除数据时执行Delete触发器

inserted delated:插入表、删除表;

逻辑表也是虚表,系统在内存中创建,不会存储到数据库中,只读的,读取但不能修改数据;

结构和操作的表相同;

在触发器执行过程中存在,且可以访问,触发器工作完成之后,这两张表会自动删除;

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本
Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本

对表的操作 inserted表 deleted表
insert 存放插入的数据 无数据  
update 存放更新后的数据--新数据 存放更新前的数据--老数据
delete 无数据 存放被删除的数据

 

 

 

 

 

 

 

 

 

查询所有触发器:select * from sysobjects where xtype='TR'

执行已存在触发器:exec sp_helptext 'trrigername'

工作原理:

After(同for):先执行增、删、改、操作,再激活触发器操作。
Instead of:在执行增、删、改、操作之前,先激活触发器。

 触发器优点:

  1.强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。
  2.跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
  3.级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
  4.嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。

触发器缺点:
  1. 可移植性差。
  2.占用服务器资源,给服务器造成压力。
  3.执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
  4.嵌套调用一旦出现问题,排错困难,而且数据容易造成不一致,后期维护不方便。

触发器使用建议:
1.尽量避免在触发器中执行耗时操作,因为触发器会与SQL语句认为在同一事务中,事务不结束,就无法释放锁。
2.避免在触发器中做复杂操作,影响触发器性能的因素比较多(Eg:产品版本,所使用的架构等),要想编写高效的触发器考虑因素比较多,编写高性能触发器还是很难的。
3.触发器编写时注意多行触发时的处理。(一般不建议使用游标)