sql触发器

84 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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表中找。

坑(易错点)

触发器的触发是针对操作触发的,不是根据行数触发的,上文中的触发器在多行操作的时候就会只触发一次。比如:当执行操作删除所有表时,触发器只会被触发一次执行一次,这时候需要循环读取下删除的数据进行循环更新在触发器中。 解决方法:

  • 在触发器内新建一个临时表,将操作的数据都存储入这个临时表中。
  • 使用游标,进行分行读取所有操作的数据。

事物提交或回滚:当触发器成功执行时会提交,当不成功时会进行回滚。