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
*/
分享到:
相关推荐
在MVC中记录操作日志,在控制器中各个action中调用这个类
QT框架开发,添加操作日志记录,本地生成txt文件记录内容,在需要记录的地方使用qDebug记录
操作日志系统通用设计,是付费下载的资料,授权传播,大家可以参考下。下载后即授权转载,可以发给需要的盆友
这是一个简单的SpringMVC用aop写操作日志的例子
用户操作日志对于每一个系统来说是不可或缺的,并且操作日志应该单独抽取为一个模块业务,不应该与主业务系统之间耦合在一起。 故而我们需要将其单独抽出并以异步的方式与主模块进行异步通信交互数据。 要求:采用...
java文件上传和下载,断点续传+aop操作日志
通用的操作日志设计
MFC 中利用Edit控件记录操作日志,具体的使用方法可以看源码。
微信小程序获取用户在小程序内的操作日志,已经独立封装在此js文件。可以直接使用,不影响原来的项目架构。把这个功能封装成了一个独立的js工具。使用方法详见博客:...
java aop 用户操作日志 在每个action\controller 上加上注解 就可以了 例如 @Log(“添加用户”) 日志包含(请求时间,请求ip,请求类名 ,请求方法,请求参数,请求异常)
操作日志(源程序C#),操作日志(源程序C#),操作日志(源程序C#)只提供参考....
真正通用的操作日志系统设计,这个是以前看到的资料,觉得不错。此文档版权属于作者本人“加伊”。
linux记录用户登录操作日志.日志分析 每次用户退出后都会产生以用户名、登录IP、时间的日志文件,包含此用户本次的所有操作(root用户除外)
此插件可以查看后台管理登录,修改,保存,删除等管理人员的操作日志。
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
这是一款查询数据库操作日志记录的工具,我个人觉得还是挺实用的!希望对各位老铁也有实质性的帮助!有好的东西也可以跟各位开发友人一块分享!
有别于SM20,STAD,ST03N等不可修改的标准查询程序。这个程序可以读取到系统的日志,使用ALV展示,大家可以在此基础上进行符合自己需求的定制开发。
那教你一个办法,自己写两个函数,一个是记录操作日志函数,一个是还原日志数据到产品表函数,主要只针对产品属性组的修改和产品相册图的修改(前提,本身我这套系统做了二次开发,增加了产品的审核和取消修改功能)...
一个不错的文件操作日志的例子哦 源码示例很好用的学习材料
文件操作日志源码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。