SQL Server 触发器

前言

SQL Server功能很强大,那么,我们是否将这些功能使用的得心应手了呢?我猜很多功能都知道,但是具体应用到开发过程中是不是就一脸懵*了呢?今天,跟着我来了解一下触发器吧!


什么是触发器???

触发器,是一种特殊类型的存储过程,不由用户直接调用。它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。他可以查询其它表,并可以包含复杂的T-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。常常用于强制业务规则和数据完整性。


触发器的优点:

  • 自动执行,表中的数据作了任何修改之后立即激活。
  • 可以通过数据库中的相关表进行层叠更改。
  • 可以强制限制,这些限制比CHECK约束所定义的更复杂,与CHECK约束不同的是,触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。

触发器种类:

  • DML( 数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生DML事件时启用。DML事件即指在表或视图中修改数据的insert、update、delete语句。
  • DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发生(DDL事件时启用。DDL事件即指在表或索引中的create、alter、drop语句也。

接下来我们对触发器使用的语法进行介绍。

例:在学生信息表中创建insert触发器,更新班级信息表中的信息。

create trigger T_addnum
on 学生信息
for insert 
as 
update 班级信息 set 班级人数=班级人数+1
where 班级编号=(select 所属班级 from #inserted)

例:在教师信息表中创建delete触发器。

create trigger T_DELETEEACHER
on 教师信息
for delete
as
  select 姓名 as 被删除的教师姓名,姓名,性别,年龄,联系电话 from #DELETED

update触发器是insert触发器和delete触发器的组合,更新数据先将其删除,再进行添加。

例:在教师信息表中添加update触发器,当教师信息表执行update操作时激活触发器。

create trigger T_UPDATE
on 教师信息
for update 
as 
if (update (姓名) or update (性别))
begin 
   print '事务不能被处理,基础数据不能修改!'
   ROLLBACK TRANSACTION
end
else
   print '数据修改成功!'

前面说到的几个触发器都属于DML触发器,接下来我们来看看DDL触发器的创建。

例:在当前数据库中创建DDL触发器中的drop,alter触发器。

create trigger T_notdelete
on database
for Drop_table,alter_table
as
  print '事务不能被处理,基础数据表不能被修改和删除!'
  ROLLBACK 

所有的触发器都要先进行创建才可触发使用!


了解了如何创建触发器,下面了解一下管理触发器。

例:禁用触发器。

alter table 员工信息
disable trigger t_add

例:启用触发器。

alter table 员工信息
enable trigger t_add

删除触发器可以直接右键进行删除,也可使用语句进行删除。

drop trigger t_add

嵌套触发器

触发器最多可以嵌套 32 层。如果一个触发器更改了包含另一个触发器的表,则第二个触发器激活,然后该触发器可以再调用第三个触发器,依此类推。如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。

例:在不同的两个表中分别创建一个触发器,一个delete触发器,一个insert触发器,执行下方的select语句查询部门信息表中部门编号为’10001’的员工人数。执行delete语句触发delete触发器,再次查询select语句,会发现员工人数多了一人。是因为首先对新员工信息表进行删除时触发了delete触发器,对员工信息表中执行insert触发器进行插入数据,对部门信息表中形成触发器嵌套,从而修改员工人数。

create trigger t_del
on 新员工信息
for delete 
as 
  insert into 员工信息(员工编号,员工姓名,所在部门编号,所任职位,性别)
  select 员工编号,员工姓名,所在部门编号,所任职位,性别
  from deleted

create trigger t_add
on 员工信息
for insert 
as 
  update 部门信息 set 员工人数=员工人数+1
  where 部门编号=(select 所在部门编号 from inserted)

select 员工人数 from 部门信息 where 部门编号='10001'

delete from 新员工信息 where 员工信息=14

递归触发器

  • 直接递归:使用直接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T1。由于表 T1 被更新,触发器TR1 再次激发,依此类推。
  • 间接递归:使用间接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T2。在这种情况下,触发器T2激发并更新 T1。

结语

触发器是开发过程中非常方便实用的功能,对理论知识有了了解了,记是记不住的,要多多实践才能更好的掌握这些知识。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值