首页>>科技 >>内容

触发器有什么作用,触发器的工作原理及作用

发布时间:2023-10-18 22:01:00编辑:温柔的背包来源:

很多朋友对触发器有什么作用,触发器的工作原理及作用不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

触发器有什么作用,触发器的工作原理及作用

触发器定义

触发器是SQL Server为程序员和数据分析师提供的一种确保数据完整性的方法。它是与表事件相关的特殊存储过程。它的执行不是由程序调用或手动启动的。但由事件触发。例如,当对表执行操作(INSERT、DELETE、UPDATE)时,就会激活其执行。

触发器的主要作用是可以实现主键和外键无法保证的复杂引用完整性和数据一致性。它们可以级联修改数据库中的相关表,比CHECK 约束更能提高性能。复杂的数据完整性和自定义错误消息。

触发器的主要功能主要包括以下几个方面:

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

触发器是自动的。对表中的数据进行任何修改后,它会立即激活。可以通过数据库中的相关表级联修改触发器。触发器可以强制执行限制。这些限制比用CHECK 约束定义的限制更复杂。与CHECK 约束不同,触发器可以引用其他表中的列。触发器的分类SQL Server 包括三种通用类型的触发器:DML 触发器、DDL 触发器和登录触发器。

DML(数据操作语言)触发器

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

SQL Server 中的DML 触发器分为三种类型:

INSERT触发器:向表插入数据时触发; DELETE触发器:当从表中删除数据时触发; UPDATE触发器:当表中的数据被修改时触发。当遇到以下情况时,您应该考虑使用DML触发器:

通过数据库中的相关表实现级联更改可以防止恶意或错误的INSERT、DELETE 和UPDATE 操作,并强制执行比CHECK 约束定义的限制更复杂的其他限制。评估数据修改前后表的状态,并根据差异采取措施。 DDL(Data Definition Language,数据定义语言)触发器

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

登录触发

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

触发器如何工作当触发器触发时:

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

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

暂时保存删除或更新前的记录行;可以从DELETED表中查看删除的数据是否符合业务需求;如果不是,则向用户报告错误消息并回滚插入操作。 INSERTED 表和DELETED 表的比较:

修改操作记录INSERTED 表DELETED 表添加(INSERT)记录存储新记录/删除(DELETE)记录/存储删除记录修改(UPDATE)记录存储更新记录创建触发器语法:

CREATE TRIGGER 触发器名称ON 表名称

[带加密]

为|之后|反而

[删除、插入、更新]

作为

T-SQL语句

笔记:

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

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

触发示例

创建学生表

create table Student(stu_id intidentity(1,1)primarykey,stu_namevarchar(10),stu_genderchar(2),stu_ageint)(提示:可以向左或向右滑动代码)

创建INSERT 触发器

--在insertasbegin后创建一个INSERT触发器create trigger trig_inserton Student --判断student_sum表是否存在if object_id(N'student_sum',N'U')为null --创建student_sum表,存储学生人数create table Student_sum ( StuCount int 默认值(0) );声明@stuNumber int;从学生中选择@stuNumber=count(*); --判断表中是否有记录如果不存在(select * from Student_sum)insert into Student_sum Values(0);更新student_sum设置stuCount=@stuNumber; --将更新后的学生总数插入到student_sum表中end--测试触发器trig_insert--功能是向student中插入数据,同时级联到student_sum表中,更新stuCount--因为是最后一个Trigger,所以触发器trig_insert;插入student(stu_name,stu_gender,stu_age)values('吕布','男',30);从student_sum中选择stuCount学生总数; insert into Student(stu_name,stu_gender,stu_age)values('貂蝉','女',30); selectstuCount从student_sum中计算学生总数;insert into Student(stu_name,stu_gender,stu_age)values('曹阿莫','男',40);从student_sum中选择stuCount学生总数;执行上述语句后,结果如下图:

由于定义了学生总数表student_sum表,向学生表插入数据后计算学生总数,因此学生总数表应禁止用户向其中插入数据。

--创建insert_forbidden,禁止用户向student_sum表插入数据create trigger insert_forbiddenon Student_sum after insertasbegin RAISERROR('禁止直接向此表插入记录,禁止操作', 1, 1) --raiserror 用于抛出异常错误回滚transactionend--触发trigger insert_forbidden插入student_sum(stuCount)values(5);结果如下:

创建删除触发器

当用户执行DELETE操作时,DELETE触发器将被激活,从而控制用户从数据库中删除数据记录的能力。触发DELETE触发器后,用户删除的记录会被添加到DELETED表中,同时原表的对应记录也会被删除,因此在DELETED表中查看删除的记录。

--创建删除触发器create trigger_deleteon Student after deleteasbegin select Stu_id 作为已删除学号,stu_name Stu_gender,stu_age from returnedend; --执行delete语句,触发trig_delete触发器delete from school where Stu_id=1;结果如下:

创建更新触发器

当用户对指定表执行UPDATE 语句时,将调用UPDATE 触发器。此类触发器用于限制用户对数据的修改。 UPDATE触发器可以执行两种操作:更新前的记录存储在DELETED表中,更新后的记录存储在INSERTED表中。

--创建更新触发器在updateasbegin之后创建触发器trig_updateon Student声明@stuCount int;从学生中选择@stuCount=count(*);更新student_sum设置stuCount=@stuCount;选择stu_id作为更新前的学号,stu_name作为更新前的学生姓名,从删除中选择; select Stu_id为更新后的学号,stu_name为更新后的学生姓名from insert;end--创建完成,执行update语句触发trig_update触发更新学生set Stu_name='张飞' where Stu_id=2;结果如下:

创建替代触发器

与前面介绍的三个AFTER触发器不同的是,SQL Server服务器执行AFTER触发器的SQL代码后,首先创建临时INSERTED表和DELETED表,然后执行代码中的数据库操作,最后激活触发器中的代码。对于替换(INSTEAD OF)触发器,当SQL Server服务器执行触发INSTEAD OF触发器的代码时,它首先创建一个临时INSERTED表和一个DELETED表,然后直接触发INSTEAD OF触发器,同时拒绝执行INSTEAD OF触发器。用户输入的DML操作。陈述。

--Create 而不是触发器create trigger trig_insteadOfon Student 而不是insertas begin 声明@stuAge int; select @stuAge=(select Stu_age from displayed) if(@stuAge 120) select 'insert Age error' as 'failure Reason'end 创建完成,执行INSERT 语句触发触发器trig_insteadOf

注解

触发器常用于早期数据处理,尤其是在处理由于某些操作而需要调整其他表的逻辑时。但随着数据量的增加,触发器对数据库性能的影响越来越大,很容易导致数据库性能下降。因此,在大数据量的场景中禁止使用触发器,但其逻辑处理功能仍然保留,说明它还有更深层次的应用场景,我们需要掌握其相关用法。

以上知识分享希望能够帮助到大家!