0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

触发器的工作原理及作用

jf_78858299 来源:SQL数据库开发 作者:丶平凡世界 杂货铺 2023-03-23 16:07 次阅读

触发器的定义

触发器(trigger)是SQL Server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( INSERT,DELETE, UPDATE)时就会激活它执行。

触发器的作用

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。

触发器的主要作用主要有以下接个方面

  • 强制数据库间的引用完整性
  • 级联修改数据库中所有相关的表,自动触发其它与之相关的操作
  • 跟踪变化,撤销或回滚违法操作,防止非法修改数据
  • 返回自定义的错误消息,约束无法返回信息,而触发器可以
  • 触发器可以调用更多的存储过程

触发器的优点

  • 触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
  • 触发器可以通过数据库中的相关表进行层叠修改。
  • 触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。

触发器的分类

 SQL Server包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。

DML(数据操作语言,Data Manipulation Language)触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。

SQL Server中的DML触发器有三种:

  • INSERT触发器:向表中插入数据时被触发;
  • DELETE触发器:从表中删除数据时被触发;
  • UPDATE触发器:修改表中数据时被触发。

当遇到下列情形时,应考虑使用DML触发器:

  • 通过数据库中的相关表实现级联更改
  • 防止恶意或者错误的INSERT、DELETE和UPDATE操作,并强制执行CHECK约束定义的限制更为复杂的其他限制。
  • 评估数据修改前后表的状态,并根据该差异才去措施。

DDL(数据定义语言,Data Definition Language)触发器

DDL触发器是当服务器或者数据库中发生数据定义语言(主要是CREATE,DROP,ALTER开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

登录触发器

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

触发器的工作原理

触发器触发时:

  • 系统自动在内存中创建INSERTED表或DELETED表;
  • 只读,不允许修改,触发器执行完成后,自动删除。

INSERTED表:

  • 临时保存了插入或更新后的记录行;
  • 可以从INSERTED表中检查插入的数据是否满足业务需求;
  • 如果不满足,则向用户发送报告错误消息,并回滚插入操作。

DELETED表:

  • 临时保存了删除或更新前的记录行;
  • 可以从DELETED表中检查被删除的数据是否满足业务需求;
  • 如果不满足,则向用户报告错误消息,并回滚插入操作。

INSERTED表和DELETED表对照:

修改操作记录 INSERTED DELETED
增加(INSERT)记录 存放新增的记录 /
删除(DELETE)记录 / 存放被删除的记录
修改(UPDATE)记录 存放更新后的记录 存放更新前的记录

创建触发器

创建触发器的语法:

CREATE TRIGGER trigger_name ON table_name

[WITH ENCRYPTION]

FOR | AFTER | INSTEAD

OF [DELETE, INSERT, UPDATE]

AS

T-SQL语句

GO

注:

*WITH ENCRYPTION 表示加密触发器定义的SQL文本

DELETE, INSERT, UPDATE指定触发器的类型*

触发器示例

创建学生表

create table student(    
stu_id int identity(1,1) primary key,    
stu_name varchar(10),    
stu_gender char(2),    
stu_age int
)

(提示:可以左右滑动代码)

创建INSERT触发器

--创建INSERT触发器
create trigger trig_insert
on student after insert
as
begin    
  --判断student_sum表是否存在        
  if object_id(N'student_sum',N'U') is null
  --创建存储学生人数的student_sum表    
  create table student_sum(
  stuCount int default(0)
  );
  declare @stuNumber int;
  select @stuNumber = count(*)from student;
  --判断表中是否有记录
  if not exists (select * from student_sum)        
  insert into student_sum values(0);
  update student_sum set stuCount =@stuNumber; 
  --把更新后总的学生数插入到student_sum表中
end


--测试触发器trig_insert
--功能是向student插入数据的同时级联插入到student_sum表中,更新stuCount
--因为是后触发器,所以先插入数据后,才触发触发器trig_insert;
insert into student(stu_name,stu_gender,stu_age)
values('吕布','男',30);
select stuCount 学生总人数 from student_sum;     
insert into student(stu_name,stu_gender,stu_age)
values('貂蝉','女',30);             
select stuCount 学生总人数 from student_sum;
insert into student(stu_name,stu_gender,stu_age)
values('曹阿瞒','男',40);                 
select stuCount 学生总人数 from student_sum;

执行上面的语句后,结果如下图所示:

图片

既然定义了学生总数表student_sum表是向student表中插入数据后才计算学生总数的,所以学生总数表应该禁止用户向其中插入数据

--创建insert_forbidden,禁止用户向student_sum表中插入数据
create trigger insert_forbidden
on student_sum after insert
as
begin    
  RAISERROR('禁止直接向该表中插入记录,操作被禁止',1,1)
  --raiserror 是用于抛出一个错误
  rollback transaction
end
--触发触发器insert_forbidden
insert student_sum (stuCount) 
values(5);

结果如下:

图片

创建DELETE触发器

用户执行DELETE操作,就会激活DELETE触发器,从而控制用户能够从数据库中删除数据记录,触发DELETE触发器后,用户删除的记录会被添加到DELETED表中,原来表的相应记录被删除,所以在DELETED表中查看删除的记录。

--创建delete触发器
create trigger trig_delete
on student after delete
as
begin    
  select stu_id as 已删除的学生编号,
  stu_name stu_gender,
  stu_age
  from deleted
end;


--执行一条delete语句触发trig_delete触发器
delete from student where stu_id=1;

结果如下:

图片

创建UPDATE触发器

UPDATE触发器是当用户在指定表上执行UPDATE语句时被调用被调用,这种类型的触发器用来约束用户对数据的修改。UPDATE触发器可以执行两种操作:更新前的记录存储在DELETED表中,更新后的记录存储在INSERTED表中。

--创建update触发器
create trigger trig_update
on student after update
as
begin    
  declare @stuCount int;
  select @stuCount=count(*) from student;
  update student_sum set stuCount =@stuCount;

  select stu_id as 更新前学生编号,
  stu_name as 更新前学生姓名 from deleted;

  select stu_id as 更新后学生编号,
  stu_name as 更新后学生姓名 from inserted;
end
--创建完成,执行一条update语句触发trig_update触发器
update student set stu_name='张飞' 
where stu_id=2;

结果如下:

图片

创建替代触发器

与前面介绍的三种AFTER触发器不同,SQL Server服务器在执行AFTER触发器的SQL代码后,先建立临时的INSERTED表和DELETED表,然后执行代码中对数据库操作,最后才激活触发器中的代码。而对于替代(INSTEAD OF)触发器,SQL Server服务器在执行触发INSTEAD OF触发器的代码时,先建立临时的INSERTED表和DELETED表,然后直接触发INSTEAD OF触发器,而拒绝执行用户输入的DML操作语句。

--创建instead of触发器 
create trigger trig_insteadOf
on student instead of insert
as 
begin    
  declare @stuAge int;
  select @stuAge=(select stu_age from inserted)
  if(@stuAge >120)
  select '插入年龄错误' as '失败原因'
end

创建完成,执行一条INSERT语句触发触发器trig_insteadOf

图片

批注

触发器在早期的数据处理过程中经常使用到,特别是在处理一些因某些动作而需要对其他表进行调整的逻辑时。但是随着数据量的增长,触发器对数据库的性能影响越来越大,容易造成数据库性能降低。所以触发器在数据量大的场景是禁止使用的,但是其逻辑处理功能还是被一直保留,说明其还是有较深的应用场景,需要我们掌握它的相关用法。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6514

    浏览量

    87610
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43466
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79554
  • 触发器
    +关注

    关注

    14

    文章

    1685

    浏览量

    60422
收藏 人收藏

    评论

    相关推荐

    什么是触发器 触发器工作原理作用

    ”,分别称为置“1”端和置“0”端。常见的触发器有R-S触发器、D触发器和J-K触发器等三种,下面简单说明它们的工作原理。类型种类按逻辑功能
    发表于 12-25 17:09

    锁存触发器工作原理是什么

    锁存工作原理是什么?锁存的动态特性及其应用有哪些?触发器工作原理是什么?触发器的电路结构
    发表于 11-03 06:48

    rs触发器工作原理

    rs触发器工作原理 一、电路组成及符号 基本RS
    发表于 01-21 13:23 1.1w次阅读
    rs<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>

    主从jk触发器电路及工作原理

    主从jk触发器电路及工作原理
    发表于 01-21 14:00 1.6w次阅读
    主从jk<b class='flag-5'>触发器</b>电路及<b class='flag-5'>工作原理</b>

    CMOS触发器的结构与工作原理

    CMOS触发器的结构与工作原理     CMOS D触发器足主-从结构形式的一种边沿触发器,CMOS T型触发器
    发表于 10-17 08:52 7242次阅读
    CMOS<b class='flag-5'>触发器</b>的结构与<b class='flag-5'>工作原理</b>

    JK触发器工作原理详细介绍

    JK触发器工作原理详细介绍 JK触发器,采用与或非电路结构,它的工作原理为:CP为0时,触发器处于一个稳态;CP由0变1时,
    发表于 03-08 13:47 5.1w次阅读

    D触发器工作原理是什么?

    D触发器工作原理是什么? 边沿D 触发器: 负跳沿触发的主从触发器工作时,必须在正跳沿前加
    发表于 03-08 13:56 6.9w次阅读
    D<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>是什么?

    什么是RS触发器,RS触发器工作原理是什么?

    什么是RS触发器,RS触发器工作原理是什么? 主从RS触发器
    发表于 03-08 14:00 3w次阅读

    施密特触发器电路及工作原理详解_施密特触发器特点_施密特触发器作用

    本文介绍了什么是施密特触发器、施密特触发器的主要特点,其次介绍了施密特触发器电路工作原理详解,最后介绍了施密特触发器的具体
    发表于 01-16 11:50 3.8w次阅读
    施密特<b class='flag-5'>触发器</b>电路及<b class='flag-5'>工作原理</b>详解_施密特<b class='flag-5'>触发器</b>特点_施密特<b class='flag-5'>触发器</b>的<b class='flag-5'>作用</b>

    jk边沿触发器工作原理

    本文开始介绍了JK触发器工作特性与边沿JK触发器的特点,其次介绍了边沿JK触发器工作原理与特点,最后介绍了集成边沿式JK
    发表于 01-30 17:17 3.6w次阅读
    jk边沿<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>

    一文看懂单稳态触发器工作原理作用

    本文开始介绍了单稳态触发器电路组成和单稳态触发器的四种基本电路图,其次详细阐述了单稳态触发器工作原理,最后介绍了单稳态触发器
    的头像 发表于 03-27 10:02 7.2w次阅读
    一文看懂单稳态<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>及<b class='flag-5'>作用</b>

    触发器作用_触发器的特点介绍

    本文开始介绍了触发器的定义和触发器的特点,其次阐述了触发器的分类和触发器作用,最后介绍了触发器
    发表于 03-27 17:35 2.1w次阅读

    单稳态触发器有哪些_单稳态触发器工作原理介绍

    本文开始阐述了单稳态触发器工作特点和单稳态触发器的分类,其次阐述了单稳态触发器工作原理,最后介绍了常用的CD4098单稳态
    的头像 发表于 03-28 15:41 3.9w次阅读
    单稳态<b class='flag-5'>触发器</b>有哪些_单稳态<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>介绍

    单稳态触发器芯片有哪些_单稳态触发器工作原理

    本文主要介绍了单稳态触发器芯片有哪些_单稳态触发器工作原理。单稳态触发器只有一个稳定状态,一个暂稳态。在外加脉冲的作用下,单稳态
    的头像 发表于 03-28 18:22 2.8w次阅读
    单稳态<b class='flag-5'>触发器</b>芯片有哪些_单稳态<b class='flag-5'>触发器</b><b class='flag-5'>工作原理</b>

    单稳态触发器工作原理

    单稳态触发器只有一个稳定状态,一个暂稳态。在外加脉冲的作用下,单稳态触发器可以从一个稳定状态翻转到一个暂稳态。   单稳态触发器工作原理
    的头像 发表于 08-12 16:27 1.3w次阅读