一、触发器介绍
1.概念
触发器是用户定义在关系表上的一类由事件驱动的特殊过程。触发器被保存在数据库服务器中。任何用户对表的增删改操作均由服务器自动激活相应的触发器。它类似于约束,但更加灵活,粒度更细,对数据的控制能力更强大。
2.触发器分类
SQL Server常见触发器类型:DML触发器,DDL触发器,登录触发器。
3.触发器优点
集中完整性控制
防止非法修改数据
进行级联操作
返回自定义的错误
调用更多存储过程
4.触发器工作原理
触发器在触发时,系统自动在内存中创建inserted表和deleted表。触发器完成后,自动删除deleted表。
inserted表临时会临时保存插入或更新后的记录行,同时可以检查插入或更新的数据是否满足需求,如果不满足则回滚。
deleted表临时保存了删除或更新的记录行,同时可以检查被删除的数据是否满足需求,如果不满足则回滚。
5.定义触发器
表结构如下:
二、简单实例
1.insert触发器
上面已经说了,订购数量要小于库存数量,订购之后库存数量要减少。为此,我们应该在订单明细表上创建触发器,既要判断数量关系又要在满足条件时更新库存数量。当订购数量大于库存数量时,进行回滚操作;当订购数量小于等于库存数量时,更新库存数量。代码如下:
create trigger check_amount on order_d
for insert
as begin
declare @id varchar(50)
declare @order_amount int
declare @amount int
select @id=id,@order_amount=order_amount from inserted
select @amount=amount from goods where id=@id;
/*select @id,@order_amount,@amount;*方便调试/
if (@order_amount>@amount)
begin
Rollback Transaction
end
else
begin
update goods set amount=@amount-@order_amount where id=@id
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
实验效果如下:
插入正确数据:
insert into order_d values('001','1',50);
1
订购数量>库存数量:
2.delete触发器
我们要达到的目的是,删除商品,订单明细里面相应数据也随之删除。这里涉及到级联删除,我们用触发器也可以完成。主要思路是:明确触发条件,明确删表顺序。我们的触发条件就是“删除商品”,删表顺序“先删订单明细表,再删商品表”。代码如下:
create trigger del on goods instead of delete
as begin
declare @id varchar(50)
select @id=id from deleted
delete from order_d where id=@id
delete from goods where id=@id
end
1
2
3
4
5
6
7
删除对比如下:
删除之前:
删除商品之后:
————————————————
版权声明:本文为CSDN博主「王小明爱吃大菠萝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41988893/article/details/103414460