触发器的作用是什么(触发器定义及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)
梦压星河梦压星河贡献者

相关推荐

  • ensemble数据库介绍(ensemble数据库使用教学)

    ESB作为常用的医疗平台软件,希望有兴趣的研发人员可以看看 1.检查三台服务器 1)三台服务器分别重新命名,例如ESB-63 2)三台服务器都要关闭防火墙,仲裁机也要关闭防火墙 3)正式ESB最好都安装在D盘,D盘的存储空间要大一些,磁盘空间多留 4)保持三台服务器的硬盘统一 PS:一定要检查三台机器的命名,然后重新命名,不然镜像不容易同步 2.拷贝ESB相关的安装东西到三台服务器,进行相关安装 …

    2023年10月25日
    0
  • 如何通过服务器安装系统

    随着云计算和虚拟化技术的不断发展,安装系统和配置服务器已经成为了企业和个人用户中越来越常见的操作。在本文中,我们将介绍如何通过服务器安装系统。 第一步:确定要安装的系统类型 在开始安装系统之前,需要确定要安装的系统类型。不同的系统有不同的安装方式和要求。例如,Windows操作系统需要管理员权限才能安装,而Linux操作系统则可以在虚拟机中进行安装。因此,在安装系统之前,需要确定要安装的系统类型,…

    2023年7月2日
    0
  • jar包怎么解压指定目录(用命令解压jar文件方法)

    现在基于springboot的服务器jar包体积越来越大, 当我们在特殊场景下,比如压力测试或者排查问题想临时修改下jar包里的内容验证下, 是不是非要重新打包上传文件呢? 答案当然是否。 1.jar命令解压jar包 2.修改文件 ? 修改配置文件 用vi修改对应内容 ? 修改class文件 修改class文件,需要重新编译 注意:linux服务器下,如果多个jar包就用冒号分割,Test.jav…

    2023年6月26日
    0
  • 光纤跳线接头型号(网线水晶头接法顺序)

    VGA(Video Graphics Array视频图形阵列): VGA(Video Graphics Array)还有一个名称叫D-Sub。VGA接口共有15针,分成3排,每排5个孔,是显卡上应用最为广泛的接口类型,绝大多数显卡都带有此种接口。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。 使用VGA连接设备,线缆长度最好不要超过10米,而且要注意接头是否安装牢固,否则可能引起图像中出…

    2023年7月7日
    0
  • 金士顿u盘质量怎么样(金士顿u盘质量了解)

    【CNMO新闻】距离新年的到来已不足一个月,马上我们就要告别辛丑牛年,迎来壬寅虎年。随着新年的到来,许多商家也会推出带有“老虎”元素的产品。CNMO了解到,金士顿官方发博表示,推出了2022年虎年生肖限量版U盘,新品造型充满趣味,触感十分柔软,支持高速读写,现售价188元。 金士顿虎年生肖U盘 金士顿公司是一家致力生产储存产品的企业,曾被美国财富杂志评为“美国最适宜工作的公司”。 目前,公司旗下产…

    2023年10月19日
    0
关注微信