热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:触发器的作用是什么(触发器定义及5大作用)

触发器的定义触发器(trigger)是sqlserver提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启

触发器的定义

触发器(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触发器
--创建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触发器,从而控制用户能够从数据库中删除数据记录,触发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语句时被调用被调用,这种类型的触发器用来约束用户对数据的修改。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大作用)
批注

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

需要了解更多数据库技术:触发器的作用是什么(触发器定义及5大作用),都可以关注数据库技术分享栏目—编程笔记


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
author-avatar
手机用户2502878113
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有