接受一个朋友的委托,希望对SBO的事务日志进行记录,并且提供查询分析功能,说实话,行为日志与审计不管对于操作系统、数据库系统或者是用户软件,尽管都是安全考虑所需要的,但是要真正的实现并且通用起来审计,是有难度的。
不过受人之托,还是忠人之事吧,用纯Sql方式实现了一个简单的日志记录与查询【姑且算是审计吧】。毕竟运行于SBO之上采用的是没有经过任何的控制介入的方法,局限太多,但是对于要求不太高的单位,还是够用了。
第一步 请在Sql server的查询分析器中运行一下脚本
1.1 创建日志表
if exists(_select* from dbo.sysobjects where id = object_id(N'fsTransLog') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table fsTransLog
go
create table fsTransLog
(
 AutoKey   int IDENTITY (1, 1) NOT FOR REPLICATION  NOT null,
 ObjectType   nvarchar(25),
 TransType   nvarchar(1),
 KeyNum   int,
 KeyColumns  nvarchar(255),
 KeyValues  nvarchar(255),
 Result   int default 0,
 ErrNotes  nvarchar(255),
 TransUser  int,
 TransTime  datetime
)
go
1.2 创建事务表单对应表,在此表中定义的事务才进行日志记录,请务必填写此表单【表单内容个填写方式可以参见附件内容】,以确保您的事务日志被记录,和日志报表信息的明晰。

if exists(_select* from dbo.sysobjects where id = object_id(N'fsTransTable') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table fsTransTable
go

create table fsTransTable 
(
 AutoKey   int IDENTITY (1, 1) NOT FOR REPLICATION  NOT null,
 TransType   nvarchar(25) not null,  --事务类型:13,×××;15,销售交货....
 TransName   nvarchar(50),   --事务类型名称:13,×××;15,销售交货....
 TransTable  nvarchar(30),   --事务对应的数据表:×××对应OINV,销售交货对应ORIN
 TransKey  nvarchar(255) not null,
 KeyName   nvarchar(1000),
 UserField  nvarchar(30) default 'UserSign',
 IsActive  bit default 0
)
go
if exists(_select* from dbo.sysobjects where id = object_id(N'fsTransType') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table fsTransType
go
create table fsTransType
(
 TransType   nvarchar(1) not null,
 TransName   nvarchar(50)
)
go
_insertINTO fsTransType(TransType,TransName)VALUES(N'A',N'添加')
_insertINTO fsTransType(TransType,TransName)VALUES(N'U',N'修改')
_insertINTO fsTransType(TransType,TransName)VALUES(N'D',N'删除')
_insertINTO fsTransType(TransType,TransName)VALUES(N'C',N'取消')
_insertINTO fsTransType(TransType,TransName)VALUES(N'L',N'关闭')
1.3 创建保存事务日志的存储过程
 如果希望对所有的日志进行记录,就去掉 if exists(_select...) 那一行语句

if exists (_select* from dbo.sysobjects where id = object_id(N'[dbo].[fsup_WriteTransLog]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[fsup_WriteTransLog]
go

create procedure fsup_WriteTransLog
 @ObjectType nvarchar(25),
 @TransType nchar(1),
 @KeyNum int,
 @KeyColumns nvarchar(255),
 @KeyValues nvarchar(255),
 @Result int,
 @ErrNotes  nvarchar(255)
as
begin
 if exists(_select* FROM fsTransTable WHERE Upper(TransType)=Upper(@ObjectType) AND IsActive=1)
 begin
  _declare@table nvarchar(30), @TransKey nvarchar(300), @UserField nvarchar(50), @strSql nvarchar(4000), @UserId int
CREATE TABLE #TransUser (UserId int)
_select@table=TransTable, @TransKey=TransKey, @UserField=UserField FROM fsTransTable WHERE Upper(TransType)=Upper(@ObjectType)
  if (IsNull(@UserField,'')<>'')
  begin
   _select@strSql = '_insertINTO #TransUser(UserId) _select' + @UserField + ' FROM ' + @table + ' WHERE ' + @TransKey + '=N''' + @KeyValues + ''''
   
   __execUTE(@strSql)
   
   _select@UserId=UserId FROM #TransUser
  end
_insertINTO fsTransLog(ObjectType,TransType,KeyNum,KeyColumns,KeyValues,Result,ErrNotes,TransTime,TransUser)
   VALUES(@ObjectType,@TransType,@KeyNum,@KeyColumns,@KeyValues,@Result,@ErrNotes,getdate(),@UserId)
 end
end
go
第二步 在 SBO_SP_TransactionNotification 过程的最后部分的_select@error, @error_message之前,加入以下语句。 对于自定义的中途捕捉到事务错误提前返回的,应该在 return 之前加入以下语句, 没有这个添加就不会记录日志

__exec fsup_WriteTransLog @object_type,@transaction_type,@num_of_cols_in_key,@list_of_key_cols_tab_del,@list_of_cols_val_tab_del, @error, @error_message

第三步 事务日志报表,在自定义报表中作如下定义
局限:
--  1、由于SBO的原因,查询条件显示的不很友好,都是最后登录时间
--  2、由于SBO的报表局限,无法实现深度关联查询

_declare@sd datetime,  @ed datetime, @userid int

_select@sd=min(a.lastLogin) FROM OUSR a WHERE a.LastLogin>='[%0]'
_select@ed=max(b.lastLogin) FROM OUSR b WHERE b.LastLogin<='[%1]'
_select@userid=c.INTERNAL_K FROM OUSR c WHERE c.U_Name<='[%2]'
_select@sd=__cast(Convert(nvarchar(10), IsNull(@sd, '2000-1-1'), 121) as datetime)
_select@ed=__cast(Convert(nvarchar(10), IsNull(@ed, getdate()), 121) + ' 23:59:59' as datetime)
_select@userid=IsNull(@userid,-100)
_selectTransTime 事务时间, TransUser 用户标识, User_Code 用户代码, U_NAME 用户名, b.TransType 事务代码, b.TransTable 事务表单, b.TransName 事务名称, a.TransType 事务类型, d.TransName 事务类型名称, KeyColumns 事务标识, KeyName 事务标识名称, KeyValues 事务标识值, case when Result=0 then N'成功' else N'失败:'+ErrNotes + N'[' + __cast(Result as nvarchar(20)) +']' end 事务结果
from fsTransLog a left join fsTransTable b on a.ObjectType=b.TransType
left join OUSR c on a.TransUser=c.INTERNAL_K
inner join fsTransType d on a.TransType=d.TransType
WHERE a.TransTime BETWEEN @sd AND @ed AND (a.TransUser=@userid OR @userid=-100)
执行效果,进入到SBO查询分析器,执行上述查询分析代码,选择日志时段和日志对象,得到相应的结果如下:

转载于:https://blog.51cto.com/foresun/194633

全Sql语句实现SBO事务日志记录与查询相关推荐

  1. 解释一下SQLSERVER事务日志记录

    解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log ...

  2. (转)解释一下SQLSERVER事务日志记录

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢 ...

  3. 第17周翻译:SQL Server中的事务日志管理的阶梯:第5级:在完全恢复模式下管理日志...

    来源:http://www.sqlservercentral.com/articles/Stairway+Series/73785/ 作者:Tony Davis, 2012/01/27 翻译:刘琼滨. ...

  4. 事物日志恢复 mysql_浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用...

    本篇文章是系列文章中的第五篇,是对前一个日志系列的补充篇.如果您对日志的基本概念还没有一个比较系统的了解,可以参看本系列之前的文章: 浅谈SQL Server中的事务日志(一)----事务日志的物理和 ...

  5. MySQL的SQL 语句:根据从表记录个数对主表排序

    MySQL的SQL 语句:根据从表记录个数对主表排序 一个主表 news,有字段 nId(自动增长),sName.     记录:     10 name10     13 name13     20 ...

  6. 报错,sql语句中尽量不要使用*,只查询需要的字段出来

    错误: sql语句中尽量不要使用*,只查询需要的字段出来. 解决: select id,tran_code,tran_name,tran_date,tran_time,tran_amount,1 as ...

  7. SQL Server移除事务日志后sys.master_files依然存在记录问题

    在SQL Server中移除了事务日志文件后,使用sys.master_files检查时发现,对应的事务日志文件记录信息依然存在sys.master_files里面,只是状态state_desc为OF ...

  8. 最全SQL 语句大全,值得收藏!

    1.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  9. 在SQL Server中读取事务日志-从黑客到解决方案

    The SQL Server transaction log is akin to a 'Black box' in an airliner. It contains all of the recor ...

最新文章

  1. 苹果布局大数据,两亿美元收购暗数据企业
  2. jquery日历插件 途牛_jquery日历插件SimpleCalendar
  3. 为什么你喜欢的女生不喜欢你
  4. 项目管理过程中的一些注意事项
  5. 如何解决大规模机器学习的三大痛点?
  6. Codeforces刷题
  7. Facebook 又搞事,违反竞业协议被起诉,PyTorch 关键技术疑侵权
  8. 量子计算机 并行,核磁共振量子计算机与并行量子计算.pdf
  9. 实现一个闹钟_iOS 14 闹钟:为啥这么难用?
  10. Atiit 常见功能 常用功能与模块的最快速解决方案
  11. 国税计算机基础知识,国税系统计算机基础知识培训课件精要.ppt
  12. 火狐主页被360导航劫持怎么办
  13. 一键怎样批量修改图片像素大小
  14. Tether市值十月下跌超过10亿美元
  15. 定义一个函数用来判断奇偶数PHP,定义函数 判断整数的奇偶性,如果是偶数则返回1,否则返回0,函数...,C语言:编写一个程序,判断一个整数的奇偶性。如果是奇数,输....
  16. 深恶痛绝……残忍虐杀何时终止?
  17. Intouch2020与施耐德PLC通讯
  18. 小程序打包体积优化策略
  19. 《自学是门手艺活》读后感
  20. 利用Python制作微信跳一跳外挂,我才是好友排名第一的人!

热门文章

  1. 最新章节 第238章 超级计算机的安排,第238章 谁敢动我们十八里铺的人?
  2. C语言的构造函数与析构函数
  3. Onvif开发之代码框架生成篇
  4. SpringBoot整合kafka之kafka分区实战
  5. MQ的连接是否是线程安全的
  6. 深入理解BeanPostProcessor接口
  7. kafka消息确认机制
  8. 标题:DKhadoop大数据处理平台监控数据介绍
  9. ym—— Android网络框架Volley(终极篇)
  10. CentOS 6.5 生产环境编译安装LNMP