SQL数据库(5)——数据库完整性----触发器

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/longxinghaofeng/article/details/53965832

触发器是一种特殊的存储过程,当用户对表中的数据进行update、insert或delete操作时自动触发执行,通常用于保障业务规则和数据完整性

触发器的常用功能

  • 完成比约束更复杂的数据约束
  • 检查所做的sql是否允许
  • 调用更多的存储过程
  • 防止数据表结构更改或数据表被删除
  • 修改其他数据表的数据
  • 发送sql mail
  • 返回自定义的错误信息

创建

常用DML触发器,即数据库中发生数据操作语言(insert、update、delete)事件时执行的存储过程

create trigger 触发器名称
on {表名 | 视图名}
{ for| after| instead of } 
{ [insert] [ , ] 
  [delete] [ , ]
  [update] }
as
  sql 语句
  1. 一个表上可以建立多个触发器
  2. 对于after型触发器,可以在同一种操作上建立多个触发器;对于instead of型触发器,在同一种操作上只能建立一个触发器
  3. 不允许在触发器中创建和更改数据库以及数据库对象的语句、以及多有的drop语句
激活触发器的动作 insert表 deleted表
insert 存放要插入的记录
update 存放要更新的记录 存放更新前的旧记录
delete 存放要删除的旧记录

后触发型触发器

使用for或after选项定义的触发器
执行过程如下
1. 执行到引发触发器执行的语句
2. 执行该语句
3. 执行触发器

create trigger basspay
on 雇员 
after inster,update
as
if exists(
    select * from 雇员 a,工作 b
    on a.工作编号=b.工作编号
    where 工资 between 最低工资 and 最高工资
)
begin
print'插入或更新数据出错'
rollback     //撤销已执行的操作
end

触发器和引发触发器执行的操作共同构成了一个事务,事务的开始是引发触发器执行的操作,事务的结束是触发器的结束

工作原理

记录改变后才会被激活执行,它主要用于记录改变后的处理和检查,一旦发现错误,可用rollback transaction语句回滚本次操作

前触发型触发器

使用instead of选项定义的触发器
执行过程如下:
1. 执行到引发触发器执行的语句
2. 执行触发器(执行触发器而不是执行引发触发器的SQL语句,从而代替引发语句的操作)

create trigger floaypay
on 雇员
instead of update
as
if not exists(
    select * from inserted
    where 浮动工资> 工资*0.3
)
update 雇员 set 浮动工资=(
    select 浮动工资 from inserted i
    where 雇员。雇员编号= i.雇员编号
)
else
print'浮动工资不能高于工资的30%'
//限制不能将“浮动工资”列的值改为超过该雇员工资的30%,如果违反约束给出提示信息:“浮动工资不能高于工资的30%”

通常在以下几种情况下,建议使用instead of触发器
1. 数据库中的数据禁止修改,此时可以使用该处发起来跳过update修改记录的SQL语句
2. 有可能要回滚修改的SQL语句:避免在修改数据后再回滚,减少服务器负担
3. 在视图中使用触发器,因为after触发器不能再视图中使用
4. 自定义修改数据,控制数据的修改方式和流程

工作原理

在记录变更之前发生,并不去执行原来的SQL语句里的操作,而去执行触发器本身所定义的操作

触发器的删除

drop trigger 触发器名

注意事项

  1. 一个表可以有多个触发器,但一个触发器只能对应一个表,但可以引用数据库以外的对象
  2. 同一个数据表中,对每个操作而言,可以建立多个after触发器,但instead of 触发器只能创建一个
  3. 对某个操作,既建了after触发器,又设置了instead of触发器,instead of触发器一定会激活,after触发器不一定会被激活
展开阅读全文

没有更多推荐了,返回首页