• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 判断字段是否被更新 新旧数据写入Audit Log表中

判断字段是否被更新 新旧数据写入Audit Log表中

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了字段,更新等相关知识,希望本文的分享对您有所帮助

客户要求,要对一个敏感数据表进行Audit跟踪。如果记录被更新时,要把旧新保存起来,是谁更改了记录,什么时候更新的等相关信息。还有一个主要问题就是客户不确定具体要跟踪那个字段,希望自己决定

Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。
还要创建另外一个表[Audit],就是存储跟踪记录的表:
代码如下:
Audit
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Audit](
[Audit_nbr] [int] IDENTITY(1,1) NOT NULL,
[AuditType] [char](1) NOT NULL,
[TableName] [nvarchar](128) NOT NULL,
[FieldName] [nvarchar](128) NULL,
[OldValue] [nvarchar](4000) NULL,
[NewValue] [nvarchar](4000) NULL,
[UserName] [nvarchar](128) NULL,
[CreateDate] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Audit_nbr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Audit] WITH CHECK ADD CHECK (([AuditType]='D' OR [AuditType]='U' OR [AuditType]='I'))
GO
ALTER TABLE [dbo].[Audit] ADD DEFAULT (getdate()) FOR [CreateDate]
GO


解决是谁更新数据,是使用这个方法:
接下来,为跟踪表写一个更新Trigger触发器。
在触发器中访问INSERTED或DELETED的内部临时触发表,会得一个异常invalid object name 'inserted' 或是invalid object name 'deleted' ,解决此问题,可以参考这篇:

下面为表更新触发器(部分),有注释:
代码如下:
--@N和@O两个变量,一个存储更新数据值,一个为原有数据值
DECLARE @sql NVARCHAR(MAX),@N DECIMAL(18,0),@O DECIMAL(18,0)
--@I变量是用户需要跟踪的字段
SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'] FROM #inserted'
--执行动态SQL语句。
EXECUTE sp_executesql @sql,
N'@N DECIMAL(18,0) OUTPUT',
@N OUTPUT;
--下面SQL代码,是从deleted表中获取原来数据值。
SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'] FROM #deleted'
EXECUTE sp_executesql @sql,
N'@O DECIMAL(18,0) OUTPUT',
@O OUTPUT;
--对比两个数据值,更新值与原有值,如果不一样,把数据插入Audit Log表中。
IF (ISNULL(@N,0) <> ISNULL(@O,0))
EXECUTE [dbo].[usp_Audit_Insert] 'U','','',@O,@N,@UserName


上面代码还有一个存储过程,原因是如果多表或是一个表有更新或是删除需要把跟踪的数据插入Audit Log表中时,为了更好维护与代码冗余,因此把插入Audit Log表的过程,写成一个存储过程:
代码如下:
usp_Audit_Insert
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_Audit_Insert]
(
@AuditType [char](1),
@TableName [nvarchar](128),
@FieldName [nvarchar](128),
@OldValue [nvarchar](4000),
@NewValue [nvarchar](4000),
@UserName [nvarchar](128)
)
AS
INSERT INTO [dbo].[Audit]
([AuditType],[TableName],[FieldName],[OldValue],[NewValue],[UserName])
VALUES
(@AuditType,@TableName,@FieldName,@OldValue,@NewValue,@UserName)
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解析mysql不重复字段值求和
  • 基于mysq字段选择的详解
  • 解析MySQL设置当前时间为默认值的方法
  • Mysql两种情况下更新字段中部分数据的方法
  • MySQL笔记之别名的使用
  • SQL字符型字段按数字型字段排序实现方法
  • MySQL 替换某字段内部分内容的UPDATE语句
  • 更新text字段时出现Row size too large报错应付措施
  • MySQL表字段设置默认值(图文教程及注意细节)
  • MySQL学习笔记4:完整性约束限制字段

相关文章

  • 2018-12-05SqlServer表死锁的解决方法分享
  • 2017-05-11MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作
  • 2018-12-05MySQL Cluster集群探索与实践
  • 2018-12-05Linux系统下mysqlcheck修复数据库命令
  • 2018-12-05MySQL中常用的SQL Mode
  • 2018-12-05MySQL中添加新用户权限的实例详解
  • 2018-12-05mysql中迅速插入百万条测试数据的方法
  • 2018-12-05编写SQL需要注意的细节Checklist总结
  • 2018-12-05MySQL优化之连接优化示例代码
  • 2018-12-05ssm框架mysql取值,有字段值为空,别的有值但是数据库都有值

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Mysql存储过程循环内嵌套使用游标示例代码
    • mysql列column常用命令的使用总结
    • mysql查询今天、昨天、近7天、近30天、本月、上一月的SQL语句
    • MySQL 自动清理binlog日志的方法
    • Mysql中关于修改root密码以及安装与配置调优的方法介绍
    • 查看mysql数据库大小、表大小和最后修改时间
    • mysql数据库中锁机制的详细介绍
    • Oracle下时间转换在几种语言中的实现_Oracle应用_脚本之家
    • Mysql中复制详细解析
    • 完美解决MSSQL"以前的某个程序安装已在安装计算机上创建挂

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有