`
mingchong2882
  • 浏览: 7964 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

操作日志

    博客分类:
  • SQL
 
阅读更多

 

if object_id('DATA_LogOfDBOperation') Is  Null /*Data数据修正操作主表*/
Begin
    Create Table DATA_LogOfDBOperation
    (
        ID uniqueidentifier Not Null Default(newid()) rowguidcol,
        Logdate datetime Not Null default(Getdate()),
        Operator nvarchar(50),
        Note nvarchar(200),
        Constraint PK_DATA_LogOfDBOperation Primary Key(ID Asc)
    )
End


if object_id('DATA_LogDetailOfDBOperation') Is Null /*Data数据修正操作明细表*/
Begin
    Create Table DATA_LogDetailOfDBOperation
    (
        ID uniqueidentifier Not Null Default(newid()) rowguidcol,
        DATA_LogOfDBOperationID uniqueidentifier Not Null,
        TableName sysname,
        Description nvarchar(max),
        OperationType nvarchar(50),
        Flag bit,
        Constraint PK_DATA_LogDetailOfDBOperation Primary Key(ID Asc),
        Constraint FK_DATA_LogDetailOfDBOperation_DATA_LogOfDBOperationID Foreign Key (DATA_LogOfDBOperationID) References DATA_LogOfDBOperation(ID)
    )
    Create Nonclustered Index IX_DATA_LogDetailOfDBOperation_DATA_LogOfDBOperationID On DATA_LogDetailOfDBOperation (DATA_LogOfDBOperationID Asc)
    Create Nonclustered Index IX_DATA_LogDetailOfDBOperation_TableName On DATA_LogDetailOfDBOperation (TableName Asc)
End

 

if object_id('sp_CreateTriggerWithAuto') Is Not Null  
	Drop Proc sp_CreateTriggerWithAuto
Go
Create     Proc sp_CreateTriggerWithAuto
(
    @TableList nvarchar(max),
    @DorpTriggerStr nvarchar(max) output
)
As

Declare @Sql nvarchar(max),
        @str nvarchar(max),
        @ObjectName nvarchar(128)

Set @str=N'
Create trigger tr_%ObjectName%_temp
    On %ObjectName%
    After Insert,update,delete
As
    Declare @Data nvarchar(Max),
        @Type char(6),
        @Table nvarchar(128),
        @Cols nvarchar(max),
        @Sql nvarchar(max)
    
    /*提取表字段内容,这里不做资料类型判断*/
    
    Select    @Table=''%ObjectName%'',
            @Data='''',
            @Cols=''''
    Select @Cols=+@Cols+'''''' ''+name+''=''''+Convert(nvarchar(max),Isnull(Quotename(''+name+'',''''"''''),''''null''''))+''
    From sys.columns 
    where object_id=object_id(@Table) 
    Set @Cols=left(@Cols,len(@Cols)-1)
    
    
    /*判断操作类型,Insert/Update/Delete*/
    
    If Exists(Select 1 From inserted) And Not Exists(Select 1 From deleted)
        Set @Type=''Insert''
    Else If exists(Select 1 From Inserted) And Exists(Select 1 From deleted)
        Set @Type=''Update''
    Else
        Set @Type=''Delete''

    /*写入日志表*/
    Begin
        --读更新前后的数据
        If Object_id(''tempdb..#TmpTrigger1'') Is Not Null
                Drop table #TmpTrigger1
        Select *,TriggerKeyFlag=0 into #TmpTrigger1 From deleted
        union all 
        Select *,TriggerKeyFlag=1 From inserted

        /*    构造的SQL语句,暂时不考虑以下情况:
        
            1.    这里不考虑开发的处理,所以取对应日志主表(DATA_LogOfDBOperation)的ID时候,读的是最新的ID,
            在目前环境中,并发的可能性很小,要是以后应用于并发环境,需要重新修改这一位置
            
            2.    当日志表在独立一个库时候,以下的语句不适用.
        */
        Set @Sql=N''Insert Into DATA_LogDetailOfDBOperation (DATA_LogOfDBOperationID,TableName,Description,OperationType,Flag) 
                        Select (Select Top(1) ID From DATA_LogOfDBOperation Order By Logdate Desc) ,
                            @table,''+@Cols+'',@Type,TriggerKeyFlag 
                            From #TmpTrigger1''
        --执行SQL语句                                                        
        exec sp_executesql @Sql,N''@table nvarchar(128),@Type nvarchar(max)'',@table,@Type
    End
'

Set @TableList=@TableList+','
Set @DorpTriggerStr=''

While @TableList>'' /*根据提供的Table列表,创建对应Table的Trigger*/
Begin

    Set @ObjectName=substring(@TableList,1,Charindex(N',',@TableList)-1)
    
    If @ObjectName>''
    Begin    
        /*构造删除Trgger语句,为过程发生错误的时候调用*/
        Set @DorpTriggerStr=@DorpTriggerStr+Char(13)+Char(10)+'If object_id(''tr_'+@ObjectName+'_temp'') Is Not Null Drop Trigger tr_'+@ObjectName+'_temp'
        Set @Sql=Replace(@Str,'%ObjectName%',@ObjectName)
        
        /*先删除之前创建的Trigger语句,以防发生错误*/
        Exec('If object_id(''tr_'+@ObjectName+'_temp'') Is Not Null Drop Trigger tr_'+@ObjectName+'_temp')
        
        /*创建 Trigger*/
        Exec(@Sql)
    End
    
    Set @TableList=stuff(@TableList,1,Charindex(N',',@TableList),'')
End

Goto SubExit

ErrorExit:

--错误处理Drop Trigger
If @DorpTriggerStr>''
    Exec(@DorpTriggerStr)

Set @DorpTriggerStr=''

SubExit:

Go
 

 

--0.准备一张表test
If object_id('test') Is Not Null
    Drop Table test
GO
Select *
    Into test
    From master.sys.all_objects
Go
    

--1创建Trigger
Declare @DorpTriggerStr nvarchar(max)
Exec sp_CreateTriggerWithAuto 'test',@DorpTriggerStr output



--2.登记操作日志
Insert Into DATA_LogOfDBOperation( ID ,Logdate ,Operator ,Note)
    Select newid(),getdate(),suser_name(),N'Data数据操作测试'


--3.对表操作动作
;With CTE_Test As
(
Select Top 2 * From test
)
Delete From CTE_Test 



--4. 删除Trigger
If @DorpTriggerStr>''
    Exec(@DorpTriggerStr)
Go

Select * From DATA_LogOfDBOperation

Select * From DATA_LogDetailOfDBOperation

 
 
/*

Drop Table DATA_LogDetailOfDBOperation
Drop Table DATA_LogOfDBOperation

*/
分享到:
评论

相关推荐

    操作日志系统设计.zip

    操作日志系统是一种重要的软件组件,它记录了用户或系统执行的各种操作,为故障排查、安全审计、性能分析和业务追踪提供了宝贵的数据。本资料"操作日志系统设计"将探讨设计这样一个系统的各个方面,帮助开发者理解和...

    在MVC中记录操作日志类

    在MVC(Model-View-Controller)架构中,记录操作日志是一项重要的功能,它能够帮助开发者追踪系统的行为,诊断问题,以及满足审计和合规需求。以下是对这一主题的详细阐述: 1. **MVC架构简介** MVC是一种设计...

    QT添加操作日志记录

    在QT框架中添加操作日志记录是软件开发过程中的一个重要环节,这有助于调试、问题排查以及系统监控。本文将详细讲解如何在QT项目中实现这一功能,以本地生成TXT文件的形式记录日志内容。 首先,我们需要理解QT中的...

    SpringMVC 写操作日志

    在本例中,关注点就是“操作日志”。AOP通过定义切点(Pointcut)来标识需要拦截的方法,然后创建一个通知(Advice),在切点方法执行前后插入额外的操作,如记录日志。Spring提供了两种主要的通知类型:前置通知...

    真正通用的操作日志系统设计.zip

    在IT行业中,操作日志系统的设计是至关重要的,它能够帮助我们记录并分析系统的操作行为,为故障排查、性能优化、安全审计等提供关键数据。本文将深入探讨如何设计一个真正通用的操作日志系统,使其具备高效性、可...

    可易文件操作日志监控器

    可易文件操作日志监控 是一个功能非常实用的软件,它可以对文件文件夹进行操作记录,例如:新建、修改、重命名、删除、复制等都可以实现记录下来,把这些记录显示到一个表格中,包含操作时间、操作类型、文件所在...

    java文件上传,断点续传+aop操作日志

    "java文件上传,断点续传+aop操作日志"这个主题涵盖了几个关键知识点:文件上传、断点续传技术、AOP(面向切面编程)以及操作日志记录。 1. **文件上传**: 文件上传是指用户通过Web页面将本地文件传输到服务器的...

    MFC 记录操作日志,使用Edit控件

    在MFC(Microsoft Foundation Class)库中,记录操作日志是一项常见的需求,它可以帮助开发者跟踪程序运行状态,排查错误。本篇文章将详细讲解如何利用MFC中的Edit控件来实现这一功能。 首先,我们需要理解MFC中的...

    后台操作日志.zip

    其中,后台操作日志是监控系统运行、维护数据安全、追踪异常行为的关键组成部分。本篇将深入探讨“后台管理插件”,特别关注“后台操作日志.zip”这一主题,旨在为开发者提供详尽的理论知识与实践指南。 一、后台...

    Spring aop 记录操作日志 Aspect 源码

    本篇将深入探讨如何使用Spring AOP来记录操作日志,并通过自定义Aspect和注解实现这一功能。 首先,我们要理解Spring AOP的基本概念。AOP是面向对象编程(OOP)的一种补充,它专注于处理那些横向的、与业务逻辑无关...

    Delphi FireDac Delta 记录操作日志 与 Delta转SQL

    本文将详细讲解如何使用 FireDAC 的 Delta 功能来记录操作日志以及如何将 Delta 转换为 SQL 语句,这对于数据库的版本控制、数据审计和错误恢复具有重要意义。 首先,让我们了解什么是 Delta。在 FireDAC 中,Delta...

    基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志框架+源代码+文档说明

    基于SpringBoot、Spring表达式语言 (SpEL)、annotation的操作日志 ### 简介 * 使用annotation来标注方法,标记操作内容 * 使用SpEL来动态生成操作日志内容,使操作日志记录更加详细(记录操作内容ID等关键信息) * ...

    真正通用的操作日志系统设计

    ### 真正通用的操作日志系统设计 #### 一、引言 操作日志系统在现代软件开发中扮演着至关重要的角色。它不仅能够帮助开发者追踪系统的操作历史,还能在出现问题时提供宝贵的信息以便进行故障排查。然而,传统的日志...

    操作日志(源程序C#)

    在IT行业中,操作日志是系统监控和故障排查的重要组成部分,尤其在开发和维护Web应用程序时,如Asp.Net框架的应用。本主题聚焦于使用C#语言实现操作日志记录的功能,这对于理解C#编程、Asp.Net应用的运行机制以及...

    RabbitMQ实战场景(一)异步记录用户操作日志 实战教程源码

    用户操作日志对于每一个系统来说是不可或缺的,并且操作日志应该单独抽取为一个模块业务,不应该与主业务系统之间耦合在一起。 故而我们需要将其单独抽出并以异步的方式与主模块进行异步通信交互数据。 要求:采用...

    Magento 后台操作日志(Enterprise Logging)

    Magento 后台操作日志(Enterprise Logging) 是一个专门针对Magento电子商务平台的高级日志功能。这个插件的目的是为了增强系统的透明度和安全性,使管理员能够详细追踪和记录后台的所有管理活动。以下是对该插件及其...

    微信小程序获取用户操作日志,获取用户操作轨迹

    微信小程序获取用户在小程序内的操作日志,已经独立封装在此js文件。可以直接使用,不影响原来的项目架构。把这个功能封装成了一个独立的js工具。使用方法详见博客:...

    用户操作日志.zip

    java aop 用户操作日志 在每个action\controller 上加上注解 就可以了 例如 @Log(“添加用户”) 日志包含(请求时间,请求ip,请求类名 ,请求方法,请求参数,请求异常)

    操作日志队列

    "操作日志队列"是一个专门用于处理日志记录的技术概念,尤其在高并发和大数据量的场景下显得尤为重要。这篇博客可能详细阐述了如何使用队列来实现高效的操作日志管理。 首先,队列是一种先进先出(FIFO)的数据结构...

    SQL操作日志系统(asp)

    本文将深入探讨如何使用ASP(Active Server Pages)来构建一个SQL操作日志系统,支持SQL Server和Oracle两大主流数据库。我们将讨论ASP的基础知识、数据库连接、SQL操作日志的实现原理以及具体的代码实现。 首先,...

Global site tag (gtag.js) - Google Analytics