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

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

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

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

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

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

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

触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
触发器可以通过数据库中的相关表进行层叠修改。
触发器可以强制限制。这些限制比用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表对照:

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

创建触发器的语法:

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指定触发器的类型

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

创建学生表

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

–创建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;

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

触发器的作用是什么(触发器定义及5大作用)
既然定义了学生总数表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);

结果如下:

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

用户执行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;

结果如下:

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

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;

结果如下:

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

与前面介绍的三种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

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

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

版权声明:拓辰网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请发送邮件至 nctcnet@vip.qq.com 举报,一经查实,本站将立刻删除。

(0)
梦压星河梦压星河贡献者

相关推荐

  • 迅雷会员加速有用吗(每日迅雷会员账号共享)

    迅雷网游加速器是一款主打电脑游戏加速服务的软件,如果想要游玩网游,但是因为网络问题,导致无法游玩的话,那么不如使用这款软件进行游玩吧!其可支持超多游戏的加速服务,且操作便捷易用,轻松选定节点并连接,效果稳定,低延迟不丢包,让你轻松享受游戏带来的乐趣! 1、全新一代加速核心,在旧版加速器的基础上升级核心,让加速效果更显著更稳定; 2、更多VIP节点线路,升级多条线路与节点服务器,有更多高质量的节点可…

    2023年10月8日
    0
  • 谷歌浏览器用不了怎么办,试试这三个方法吧

    谷歌浏览器是一款浏览网页速度非常快的浏览器,很多用户都喜欢用它来浏览网页。但最近有不少用户遇到了谷歌浏览器打不开网页的问题,该如何解决呢?今天我就给大家分享下谷歌浏览器打不开网页的解决方法,希望能够帮助到大家解决问题! 1、右击桌面右下角的网络和共享中心图标,选择打开; 2、在打开的界面中点击打开本地连接; 3、点击属性,在属性界面中找到并双击打开“Internet协议版本4”,点击选择“使用下面…

    2023年10月14日
    0
  • 阿里云服务器需要备案吗(讲述不需要备案的服务器)

    域名主要就是由域名服务器分割出来的由一串字母、字符、数字形成的位置代码,现在域名注册市场火热,域名注册种类也比较多。域名可分为中文域名和英文域名,在互联网还可分一、二、三级域名,也会有其他的分类方法。 域名备案是指网站备案,是指将你的网站在工信部系统中进行登记,相当于是给网站做个实名认证。域名需要指向一个网站时是必须要进行备案的,备案的目的就是为了防止在网上从事非法的网站经营活动,打击不良互联网信…

    2023年9月17日
    0
  • 特斯拉从比特币中赚了6亿美元,究竟是谁蹭了谁的热度?

    从2020年11月到2021年2月,短短四个月的时间里,比特币的价格一路疯涨,成功突破5万美元大关。很难想象,在11年前被调侃“一万枚才能买份披萨”的比特币,如今一枚不到就足够买下一台特斯拉Model 3。 如今,比特币成为了整个金融圈的宠儿,人人都开始讨论去中心化金融,将实现财富自由的梦想寄托在了加密货币身上。而不少企业和投资机构也纷纷转变态度,开始涉足加密货币市场,更为加密货币的火爆添了一把柴…

    2023年10月26日
    0
  • 如何抗ddos攻击,教你一个不花一分钱又有效的好方法

    DDoS 攻击近几年来非常常见,许多知名的平台网站都遭遇过。当应用层 DDoS 攻击当前已经是最常见的攻击类型之时,对于程序员而言,有哪些必须掌握的 DDoS 攻击的知识点,更为关键的是,如何进行有效的防御实践?在「CSDN 在线峰会 —— 阿里云核心技术竞争力」上,在系统、应用、网络安全领域拥有 14 年研究经验的阿里云资深安全专家叶敏深入分享了新型应用层 DDoS 攻击防御的最佳实践,希望能够…

    2023年11月2日
    0
关注微信