专业游戏门户,分享手游网游单机游戏百科知识攻略!

嗨游网
嗨游网

sql触发器教学(SQL高级知识触发器)

来源:小嗨整编  作者:小嗨  发布时间:2023-03-15 11:15
摘要:触发器(trigger)是SQLServer提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(INSERT,DELE...
触发器的定义

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

sql触发器教学(SQL高级知识触发器)

触发器的作用

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比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表对照:

创建触发器

创建触发器的语法:

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(11) primary key stu_name varchar(10) stu_gender char(2) stu_age int)

创建INSERT触发器

--创建INSERT触发器create trigger trig_inserton student after insertasbegin --判断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_namestu_genderstu_age)values('吕布''男'30);select stuCount 学生总人数 from student_sum; insert into student(stu_namestu_genderstu_age)values('貂蝉''女'30); select stuCount 学生总人数 from student_sum;insert into student(stu_namestu_genderstu_age)values('曹阿瞒''男'40); select stuCount 学生总人数 from student_sum;

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

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

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

结果如下:

创建DELETE触发器

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

--创建delete触发器create trigger trig_deleteon student after deleteasbegin select stu_id as 已删除的学生编号 stu_name stu_gender stu_age from deletedend;--执行一条delete语句触发trig_delete触发器delete from student where stu_id=1;

结果如下:

创建UPDATE触发器

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

--创建update触发器create trigger trig_updateon student after updateasbegin 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_insteadOfon student instead of insertas begin declare @stuAge int; select @stuAge=(select stu_age from inserted) if(@stuAge >120) select '插入年龄错误' as '失败原因'end

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

批注

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

觉得不错,还请各位老铁们多多转发~


本文地址:IT知识频道 https://www.eeeoo.cn/itzhishi/926927.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!


IT知识
小编:小嗨整编
相关文章相关阅读
  • 电脑初学者(电脑基础知识新手入门最全电脑知识干货)

    电脑初学者(电脑基础知识新手入门最全电脑知识干货)

    电脑初学者(电脑基础知识初学者,最全的电脑知识,干货)一、计算机软硬件基础知识1.你觉得CPU型号怎么样?CPU是一台电脑的核心,但目前笔记本市场基本被英特尔的CPU垄断。而且英特尔的CPU型号命名还算有规律。以i7-6920HQ为例:四...

  • 养蜂知识(容易遗忘的养蜂知识,经常有养蜂人忘记)

    养蜂知识(容易遗忘的养蜂知识,经常有养蜂人忘记)

    养蜂知识(容易遗忘的养蜂知识,经常被养蜂人遗忘)时间过得真快!转眼间,养蜂十几年过去了。饲养蜜蜂本来是对环境有益的事情。哪里有蜜蜂,哪里就有鲜花。想要养殖蜜蜂,除了丰富的蜜源植物,还需要养蜂人掌握各种养蜂技术。其实很多养蜂技术在我们初来乍...

  • 测光模式(摄影基础知识:相机的测光模式)

    测光模式(摄影基础知识:相机的测光模式)

    测光模式(摄影基础:相机的测光模式)相机在拍照时,根据测光结果指导曝光参数的设置,从而拍摄出正常曝光的照片。测光模式就是相机划分拍摄画面的测光区域。对于同一个画面,不同的测光模式拍摄出来的画面亮度和暗度会有所不同,所以选择正确的测光模式进...

  • 等闲识得东风面的下一句?(涨知识:“等闲识得东风面,万紫千红总是春”)

    等闲识得东风面的下一句?(涨知识:“等闲识得东风面,万紫千红总是春”)

    等闲识得东风面的下一句?(涨知识:“等闲识得东风面,万紫千红总是春”)adminV管理员/2022-09-0303:20:04/0评论/586阅读0903轻松知道东风的下一句话?(知识往上走:“闲时知东风,色常春”)与唐诗的发展...

  • 车辆保养知识(新手必看十大汽车保养常识)

    车辆保养知识(新手必看十大汽车保养常识)

    汽车保养知识(新手必看的十大尤优资源网汽车保养知识)新车买的好,一定离不开我们对车的呵护和保养,所以日常保养是必不可少的。因此,做好汽车的日常保养尤为重要。那么如何才能做好自己爱车的日常保养以及生活中养车应该注意些什么呢?听听小编汽车生活...

  • 中国戏曲知识(中国戏曲知识大全)

    中国戏曲知识(中国戏曲知识大全)

    中国戏曲知识(中国戏曲知识大全)一,中国戏曲的特点1.它始于逃兵,终于他。中国戏曲是一种综合性的舞台艺术形式。它的特点是许多艺术形式聚集在一个标准中,在共同的性质中体现出各自的个性。这些形式主要包括:诗歌、音乐和舞蹈。诗是指它的文学,音乐...

  • 汽车美容店知识(汽车美容基础知识)

    汽车美容店知识(汽车美容基础知识)

    汽车美容店知识(汽车美容基础知识)打蜡的销售一、基础知识1.打蜡是传统的汽车漆面保养。蜡主要由天然蜡或合成蜡组成,能渗透到漆面的缝隙中,使表面光滑,增加亮度。打蜡是在漆面上安装一层保护膜,然后将蜡甩光,将漆面与环境中的有害物质隔离,增强漆...

  • 香水知识(你应该知道的香水知识!)

    香水知识(你应该知道的香水知识!)

    香水知识(你应该知道的关于香水的知识!)之一,香水浓度1.Parfum(浓香):香精浓度20%-40%,留香时间可达24小时以上。2.EauDeParfum缩写EDP(香水):香精浓度10%-20%,香味持续5-8小时,适合外出、宴会...

  • 周排行
  • 月排行
  • 年排行

精彩推荐