iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何分析SQL Server数据库触发器概念、原理及案例
  • 730
分享到

如何分析SQL Server数据库触发器概念、原理及案例

2024-04-02 19:04:59 730人浏览 独家记忆
摘要

如何分析SQL Server数据库触发器概念、原理及案例,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。概述触发器(trigge

如何分析SQL Server数据库触发器概念、原理及案例,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

概述

触发器(trigger)是sql server  提供给程序员数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(  insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

如何分析SQL Server数据库触发器概念、原理及案例

一、触发器的优点

1.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。

2.触发器可以通过数据库中的相关表进行层叠修改。

3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。

二、触发器的分类

SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。

如何分析SQL Server数据库触发器概念、原理及案例

1.DML(数据操作语言,Data Manipulation Language)触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:

insert触发器:向表中插入数据时被触发;

delete触发器:从表中删除数据时被触发;

update触发器:修改表中数据时被触发。

当遇到下列情形时,应考虑使用DML触发器:

  • 通过数据库中的相关表实现级联更改

  • 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。

  • 评估数据修改前后表的状态,并根据该差异才去措施。

2.DDL(数据定义语言,Data Definition Language)触发器

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

3.登录触发器

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

三、触发器的工作原理

[DELETE, INSERT, UPDATE]对应为当执行删除、插入、更新三种动作时被触发

执行insert时,获取插入后的数据,可用select*from inserted读取

执行delete时,获取删除前的数据,可用select*from deleted读取

执行update时,获取更新前的数据,可用select*from deleted读取,获取更新后数据,可用select*from  inserted读取

如何分析SQL Server数据库触发器概念、原理及案例

四、创建触发器

1、创建触发器的语法:

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

2、创建insert触发器

--创建insert触发器 create trigger trig_insert on student after insert as begin  if object_id(N'student_sum',N'U') is null--判断student_sum表是否存在  create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表  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;

3、创建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;

4、创建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;

五、管理触发器

1.查看触发器

(1).查看数据库中所有的触发器

--查看数据库中所有的触发器 use 数据库名 go select * from sysobjects where xtype='TR'

sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。

(2).sp_helptext 查看触发器内容

use 数据库名 go exec sp_helptext '触发器名称'

将会以表的样式显示触发器内容。

除了触发器外,sp_helptext 还可以显示 规则、默认值、未加密的存储过程、用户定义函数、视图的文本。

(3).sp_helptrigger 用于查看触发器的属性

sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为 char(6) 类型,可以是  INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。

--查看数据库中所有的触发器 use 数据库名 go select * from sysobjects where xtype='TR'

use 数据库名goexec sp_helptrigger tableName

2.禁用启用触发器

禁用:alter table 表名 disable trigger 触发器名称

启用:alter table 表名 enable trigger 触发器名称

如果有多个触发器,则各个触发器名称之间用英文逗号隔开。

如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。

3.修改触发器

--修改触发器语法 ALTER TRIGGER trigger_name   ON table_name   [ WITH ENCRYPTION ]   FOR {[DELETE][,][INSERT][,][UPDATE]}  AS  sql_statement;

4.删除触发器

 --语法格式:  DROP TRIGGER { trigger } [ ,...n ] 参数:  trigger: 要删除的触发器名称  n:表示可以删除多个触发器的占位符

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 如何分析SQL Server数据库触发器概念、原理及案例

本文链接: https://www.lsjlt.com/news/68225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql中外码怎么设置
    sql 中外码设置步骤:确定父表和子表。在子表中创建外码列,引用父表主键。使用 foreign key 约束将外码列链接到父表主键。指定引用动作,以处理父表数据更改时的子表数据操作。 ...
    99+
    2024-05-15
  • sql中having是什么
    having 子句用于过滤分组结果,应用于分组后的数据集。它与 where 子句类似,但基于分组结果而不是原始数据。用法:1. 过滤分组后的聚合值。2. 根据分组后的...
    99+
    2024-05-15
  • 在sql中空值用什么表示
    在 sql 中,空值表示未知或不存在的值,可使用 null、空字符串或特殊值表示。处理空值的方法包括使用操作符(is null/is not null)、coalesce 函数(返回第一...
    99+
    2024-05-15
    oracle
  • sql中number什么意思
    sql 中的 number 类型用于存储数值数据,包括小数和整数,特别适合货币、度量和科学数据。其精度由 scale(小数点位数)和 precision(整数字段和小数字段总位数)决定。...
    99+
    2024-05-15
  • sql中空值赋值为0怎么写
    可以通过使用 coalesce() 函数将 sql 中的空值替换为指定值(如 0)。coalesce() 的语法为 coalesce(expression, replacement),其...
    99+
    2024-05-15
  • sql中revoke语句的功能
    revoke 语句用于撤销指定用户或角色的权限或角色成员资格。可撤销的权限包括 select、insert、update、delete 等,撤销的对象类型包括表、视图、存储过程...
    99+
    2024-05-15
    敏感数据
  • sql中REVOKE是什么意思
    revoke 是 sql 中用于撤销用户或角色对数据库对象权限的命令。它通过撤销权限类型、对象级别和目标权限来实现:权限类型:撤销 select、insert、update、d...
    99+
    2024-05-15
  • sql中sp是什么意思
    sql中的sp是存储过程的缩写,它是一种预编译的、已命名的sql语句块,存储在数据库中,可以被用户通过简单命令调用。存储过程的特点有:可重用性、模块化、性能优化、安全性、事务支持。存储过...
    99+
    2024-05-15
    敏感数据
  • sql中references是什么意思
    sql 中的 references 关键字用于在外键约束中定义表之间的父-子关系。外键约束确保子表中的行都引用父表中存在的行,从而维护数据完整性。references 语法的格式为:fo...
    99+
    2024-05-15
  • sql中判断字段为空怎么写
    sql 中可通过 4 种方法判断字段是否为空:1)is null 运算符;2)is not null 运算符;3)coalesce() 函数;4)case 语句。例如,查询所有 colu...
    99+
    2024-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作