携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情 >>
触发器
前言
触发器在执行插入,更新,删除等操作前后自动触发,触发器分为两种,分别是DML触发器和DDL触发器
DML触发器
DML触发器根据触发器发生的时间,编写触发器所使用的语言,可以分成AFTER触发器、INSTEAD OF触发器 、CLR触发器。
AFTER触发器
一个表中可以有多个AFTER触发器。每个触发器应用在一个表,一个触发器可以同时应用于3个用户操作(update、insert、delete) ex: 创建商品表及库存表,触发器当删除商品时也将对应的库存删除
CREATE TABLE testDB.dbo.tproduct (
id int IDENTITY(0,1) NOT NULL,
product_name nvarchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
price int NULL
);
CREATE TABLE testDB.dbo.tinventory (
id int IDENTITY(0,1) NOT NULL,
remain int NULL,
product_id int NULL
);
触发器:
CREATE TRIGGER productTigger ON testDB.dbo.tproduct
AFTER DELETE
AS
declare @id int
select @id=id from deleted
delete FROM tinventory where id = @id
;
declare是声明变量的含义 AS就是当设定的操作执行时触发器需要做什么
Deleted与inserted表含义:
当新增时会将新增数据插入inserted临时表 当删除时会将删除的数据插入Deleted临时表 当更新的时候等同于先删除数据后再插入,所以找更新前数据去Deleted中找,找更新后的数据时去inserted表中找。
坑(易错点)
触发器的触发是针对操作触发的,不是根据行数触发的,上文中的触发器在多行操作的时候就会只触发一次。比如:当执行操作删除所有表时,触发器只会被触发一次执行一次,这时候需要循环读取下删除的数据进行循环更新在触发器中。 解决方法:
- 在触发器内新建一个临时表,将操作的数据都存储入这个临时表中。
- 使用游标,进行分行读取所有操作的数据。
事物提交或回滚:当触发器成功执行时会提交,当不成功时会进行回滚。