触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作

简介: 本文参考:http://www.cnblogs.com/lyhabc/articles/3236985.html   --触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作 2013-6-18-- 建测试表USE [pratice]GOc...

本文参考:http://www.cnblogs.com/lyhabc/articles/3236985.html

 

img_405b18b4b6584ae338e0f6ecaf736533.gif
-- 触发器记录表某一个字段数据变化的日志 包括插入insert 修改update 删除delete 操作 2013-6-18
--
 建测试表
USE  [ pratice ]
GO
create  table sto
(id  int  not  null,     --  主键字段
de  datetime          --  被跟踪的字段
constraint pk_sto  primary  key(id)
)

--  建日志表
create  table log_sto
(logid  int  not  null  identity( 1, 1),   --  日志序号(日志主键)
operate  varchar( 10),                --  操作类型 如Insert,Update,Delete.
id  int,                             --  原表ID(主键)
old_de  datetime,                    --  de字段旧值
new_de  datetime,                    --  de字段新值
spid  int  not  null,                  --  spid
login_name  varchar( 100),            --  登录名
prog_name  varchar( 100),             --  程序名
hostname  varchar( 100),              --  主机名
ipaddress  varchar( 100),             --  IP地址
runsql  varchar( 4000),               --  执行的TSQL代码
UDate  datetime                      --  操作日期时间
constraint pk_logsto  primary  key(logid)
)


--  建跟踪触发器
create  trigger tr_sto
on sto after  update, insert, delete
as
begin
    declare  @di  table(et  varchar( 200),pt  varchar( 200),ei  varchar( max))
    insert  into  @di  exec( ' dbcc inputbuffer(@@spid) ')
  
    declare  @op  varchar( 10)
    select  @op = case  when  exists( select  1  from inserted)  and  exists( select  1  from deleted)
                    then  ' Update '
                    when  exists( select  1  from inserted)  and  not  exists( select  1  from deleted)
                    then  ' Insert '
                    when  not  exists( select  1  from inserted)  and  exists( select  1  from deleted)
                    then  ' Delete '  end
                  
    if  @op  in( ' Update ', ' Insert ')
    begin
    insert  into log_sto
     (operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
      select  @op,n.id,o.de,n.de, @@spid,
       ( select login_name  from sys.dm_exec_sessions  where session_id = @@spid),
       ( select program_name  from sys.dm_exec_sessions  where session_id = @@spid),
       ( select hostname  from sys.sysprocesses  where spid = @@spid),
       ( select client_net_address  from sys.dm_exec_connections  where session_id = @@spid),
       ( select  top  1  isnull(ei, ''from  @di),
        getdate()
      from inserted n
      left  join deleted o  on o.id =n.id
    end
    else
    begin
      insert  into log_sto
       (operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
        select  @op,o.id,o.de, null, @@spid,
         ( select login_name  from sys.dm_exec_sessions  where session_id = @@spid),
         ( select program_name  from sys.dm_exec_sessions  where session_id = @@spid),
         ( select hostname  from sys.sysprocesses  where spid = @@spid),
         ( select client_net_address  from sys.dm_exec_connections  where session_id = @@spid),
         ( select  top  1  isnull(ei, ''from  @di),
          getdate()
        from deleted o
    end
end
go


-- > 测试DML操作

--  操作1
insert  into sto(id,de)  values( 1, ' 2012-01-01 05:06:07 ')
go

--  操作2
insert  into sto(id,de)  values( 2, ' 2012-01-01 06:06:07 ')
go

--  操作3
update sto  set de = getdate()  where id = 2
go

--  操作4
update sto  set de = getdate()  where id = 1
go

--  操作5
insert  into sto(id,de)  values( 3, ' 2012-01-01 15:26:37 ')
go

--  操作6
delete sto  where id = 2
GO

SELECT  *  FROM log_sto
View Code

 

 改进版本:1、只记录Update字段时,新老值不一致情况。注意NULL是不能进行比较。需要用到Isnull进行转换后,方可进行比较操作。

 

img_405b18b4b6584ae338e0f6ecaf736533.gif
--  建跟踪触发器
ALTER  trigger tr_sto
on sto after  update, insert, delete
as
begin
    declare  @di  table(et  NVARCHAR( max),pt  NVARCHAR( max),ei  NVARCHAR( max))
    insert  into  @di  exec( ' dbcc inputbuffer(@@spid) ')
  
    declare  @op  varchar( 10)
    select  @op = case  when  exists( select  1  from inserted)  and  exists( select  1  from deleted)
                    then  ' Update '
                    when  exists( select  1  from inserted)  and  not  exists( select  1  from deleted)
                    then  ' Insert '
                    when  not  exists( select  1  from inserted)  and  exists( select  1  from deleted)
                    then  ' Delete '  end
                  
    if  @op  = ' Update '
    -- IF UPDATE(de)  --关键字段发生表更记录。
    -- BEGIN
        BEGIN
        insert  into log_sto
         (operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
          select  @op,n.id,o.de,n.de, @@spid,
           ( select login_name  from sys.dm_exec_sessions  where session_id = @@spid),
           ( select program_name  from sys.dm_exec_sessions  where session_id = @@spid),
           ( select hostname  from sys.sysprocesses  where spid = @@spid),
           ( select client_net_address  from sys.dm_exec_connections  where session_id = @@spid),
           ( select  top  1  isnull(ei, ''from  @di),
            getdate()
          from inserted n
          left  join deleted o  on o.id =n.id
          WHERE  ISNULL(o.de, '') <> ISNULL(n.de, ''-- 只记录修改字段old值和new值不一样的情况。
          -- WHERE CHECKSUM(o.de)<>CHECKSUM(n.de) 
        END
    -- end
    ELSE  if  @op  = ' Insert '
    begin
    insert  into log_sto
     (operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
      select  @op,n.id,o.de,n.de, @@spid,
       ( select login_name  from sys.dm_exec_sessions  where session_id = @@spid),
       ( select program_name  from sys.dm_exec_sessions  where session_id = @@spid),
       ( select hostname  from sys.sysprocesses  where spid = @@spid),
       ( select client_net_address  from sys.dm_exec_connections  where session_id = @@spid),
       ( select  top  1  isnull(ei, ''from  @di),
        getdate()
      from inserted n
      left  join deleted o  on o.id =n.id
    end
    else
    begin
      insert  into log_sto
       (operate,id,old_de,new_de,spid,login_name,prog_name,hostname,ipaddress,runsql,UDate)
        select  @op,o.id,o.de, null, @@spid,
         ( select login_name  from sys.dm_exec_sessions  where session_id = @@spid),
         ( select program_name  from sys.dm_exec_sessions  where session_id = @@spid),
         ( select hostname  from sys.sysprocesses  where spid = @@spid),
         ( select client_net_address  from sys.dm_exec_connections  where session_id = @@spid),
         ( select  top  1  isnull(ei, ''from  @di),
          getdate()
        from deleted o
    end
end
go
View Code

 

 

 

 

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之pyodps的线程限制是什么意思
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
197 3
|
DataWorks 数据可视化 安全
DataWorks产品使用合集之SLS日志中新增了存在iotId这个字段,同步的时候怎么手动增加
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
205 3
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
弹性计算 Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之集成sls时出现报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
241 0
|
SQL 关系型数据库 MySQL
Hadoop-25 Sqoop迁移 增量数据导入 CDC 变化数据捕获 差量同步数据 触发器 快照 日志
Hadoop-25 Sqoop迁移 增量数据导入 CDC 变化数据捕获 差量同步数据 触发器 快照 日志
208 0
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
309 1
|
监控 数据管理 关系型数据库
数据管理DMS使用问题之是否支持将操作日志导出至阿里云日志服务(SLS)
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
监控 数据库
neo4j数据插入操作有日志吗
【6月更文挑战第29天】neo4j数据插入操作有日志吗
352 1
|
存储 运维 Java
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
Spring运维之boot项目开发关键之日志操作以及用文件记录日志
301 2
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
235 0

热门文章

最新文章