绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
SQL Server触发器学习与实例
2019-12-09 19:28:29

一、触发器介绍

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

数据库风云圈
创建时间:2019-01-21 15:58:46
纵览数据库变幻风云,这里为你一一道尽。关于数据库你想知道的那些事,这里面可能都有。快来一起玩耍吧。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • u_9a3ed7a37f8e4a
    栈主

小栈成员

查看更多
  • 唐川ITPUB
  • boss_ch
  • Jack2k
  • 小雨滴
戳我,来吐槽~