一.sql有时多张表具有联动关系,或者自己一张表要保持一定的更新。当对一张表,进行更新、删除、插入等操作时,会需要对另外一张表进行改动操作或者对本身要有其他操作。这时就需要创建sql触发器
二.创建步骤
1.打开sqlserver,在右侧"对象资源管理器”找到需要操作的数据库,点开数据库找到需要创建’触发器‘的表,点击表名左侧的加号,会出现如下所示
右键点击’触发器‘,选择’新建触发器‘
如上图所示,1后面写上触发器名称,2写上所操作的表名,3,处写上当对表有“何种操作(insert,delete,update)时触发
begin 后开始写触发后执行何种操作。
触发器是利用了表数据发生变化时,自动生成的两个虚拟表,一个是inserted,一个是deleted,这两个虚拟表从其他地方是检索不到的,只有触发器能读到。
当数据发生变化时,如果是新插入数据,则该数据会在inserted里面暂时保存。而删除一条数据时,则会在deleted里面暂时保存。更新则等于先删除再插入,也就是deleted里面存更新前,inserted里面存更新后。这些数据会在触发器执行完成后消失。
这样我们需要的数据只要从inserted和deleted里面读取到就可以了。
下面看一个例子
USE [wbxdbx]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tgr_inspectstate_update]
ON [dbo].[inspectstate]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
select @stateid=[inspestateid] from inserted --新插入的数据
insert into [inspecthistory] select * from delete; --
end
END
上述意思是在[inspectstate]表下面创建一个名为”[dbo].[tgr_inspectstate_update]“的触发器,只要一有数据更新,那么就会把 更新之前的一条数据插入到 【inspecthistory] 这张表里
但是有时我们需要监控,指定列的更新,只有当某一列更新 或者 只有当某一列更新为某一个数值时 我们才启动触发器
这是只要稍加改动,在BEGIN 之前加上限制条件
USE [wbxdbx]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tgr_inspectstate_update]
ON [dbo].[inspectstate]
AFTER UPDATE
AS
declare @stateid int
if(UPDATE([inspestateid])) --新加的判断条件,只有 [dbo].[inspectstate]的 inspestateid更新时才会启动触发器
BEGIN
SET NOCOUNT ON;
select @stateid=[inspestateid] from inserted --新插入的数据
if(@stateid in (3,4)) --进一步加了限制条件,只有当 [dbo].[inspectstate]的 inspestateid更新 为 ’3‘或者’4‘时,才会启动触发器操作
begin
end
end
END