一.sql有时多张表具有联动关系,或者自己一张表要保持一定的更新。当对一张表,进行更新、删除、插入等操作时,会需要对另外一张表进行改动操作或者对本身要有其他操作。这时就需要创建sql触发器

二.创建步骤

   1.打开sqlserver,在右侧"对象资源管理器”找到需要操作的数据库,点开数据库找到需要创建’触发器‘的表,点击表名左侧的加号,会出现如下所示

     




sql server 触发器 限制登录 sql server触发器在哪里?_sql server 触发器 限制登录

右键点击’触发器‘,选择’新建触发器‘

sql server 触发器 限制登录 sql server触发器在哪里?_sql server 触发器 限制登录_02

如上图所示,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