标签归档:触发器

mssql sqlserver 使用触发器监控某个字段是否被修改


摘要:
下文讲述sqlserver中使用触发器监控指定字段是否发生变化的方法分享,如下所示:
实验环境:sql server 2008 R2



应用背景:
今天同事让我们制作一个功能,当数据表中的指定字段被修改后,将日志信息放入到指定的数据表上,此处我们采用了触发器实现此功能

    ---创建触发器
create trigger [tig_log] on  数据表名称
after update  
as 
begin
       --数据表必须有主键,不然无法关联数据
        ---例:检测字段info 是否发生变化 keyId 为数据表中的主键
       select @flag int   ---不等于0代表指定字段发生过变化
       select @flag   =
            case when a.info =b.info then 0 else 1
            end 
       from inserted a left join deleted b on a.keyId = b.keyId 
end

触发器遇到多条数据插入或更新的注意事项


摘要:
在触发器的使用中,我们需特殊注意,当批量更新或批量插入数据时,数据表上的触发器只会被触发一次,此时我们在触发器中,处理数据时,一定要特殊注意,将所影响的数据返回至一个临时表中,然后对数据依次处理
实验环境:sql server 2008 R2

例:

      create table [maomao365.com]
        (keyId int identity,
         info    varchar(20)
        )
       go 
       ---例: update建立触发器
        create trigger tr_maomao
        as 
        begin  
             declare @tmp table(keyId int identity, info varchar(20))
             insert into @tmp (info) select info from @inserted   
             ---循环 "@tmp表"开始
             
             ---循环 "@tmp表"结束
     
        end 
      go 
      truncate table  [maomao365.com]
      drop       table  [maomao365.com]

mssql SQL SERVER使用触发器记录sql账号的登录日志


摘要:
下文讲述使用触发器记录sql账号登录日志的方法分享,如下所示:
实验环境:sql server 2008 R2


例:

---1.建立登陆日志存储表
  CREATE   TABLE tbLoginLog 
   (  
    keyId INT NOT NULL IDENTITY(1, 1) ,  
    write date DATETIME NOT NULL  DEFAULT  get date(),                    ---操作时间  
    USERID VARCHAR(128) NOT NULL DEFAULT   SUSER_SNAME() ,     ---登陆账户     
    HOSTNAME VARCHAR(128) NOT NULL DEFAULT  HOST_NAME() ,     ---客户端的机器名                 
    APPNAME VARCHAR(128)NOT NULL DEFAULT  APP_NAME())            ---应用程序名称                          
   )    

  ---2.建立服务器触发器监控登陆日志,并写入至日志表中
go
 CREATE TRIGGER tr_loginLog
ON ALL SERVER  
FOR LOGON  
AS  
BEGIN  
 
    DECLARE @USERID VARCHAR(128) ,                          
        @HOSTNAME VARCHAR(128) ,                                                
        @APPNAME VARCHAR(128)                         
   
    SELECT  @USERID = LOGINAME ,                        --sql操作时使用的sql账户          
            @HOSTNAME = HOSTNAME ,                       --客户端机器名                            
            @APPNAME = PROGRAM_NAME                    --客户端程序名
    FROM    MASTER..SYSPROCESSES  
    WHERE   SPID = @@SPID  
   
    INSERT  tbLoginLog  
            ( 
              USERID ,  
              HOSTNAME ,   
              APPNAME  
            )  
            VALUES(   
                    @USERID ,  
                    @HOSTNAME ,  
                    @APPNAME)  
 
   
END; 
go


---3.查询日志信息
 select  * from tbLoginLog
go