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

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

解决是谁更新数据,是使用这个方法:在SQL触发器或存储过程中获取在程序登录的用户

接下来,为跟踪表写一个更新Trigger触发器。

在触发器中访问INSERTED或DELETED的内部临时触发表,会得一个异常invalid object name 'inserted' 或是invalid object name 'deleted' ,解决此问题,可以参考这篇:

EXEC(EXECUTE)函数访问INSERTED或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','<tableName>','<fieldName>',@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)

时间: 2024-10-24 02:01:43

判断字段是否被更新 新旧数据写入Audit Log表中的相关文章

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

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, [AuditTy

C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)

原文:.net使用SqlBulkCopy导入数据(创建新表) .net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高.  包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.代码如下:   /// <summary> /// 将DataTable写入数据库的表中 /// </summary> /// <param name="source">数据源Da

使用C# 在sqlite数据库中更新一条数据,当前应用程序中是有效的,当我关闭应用程序后,再次打开应用程序,查询,发现更改失败,请各位大神们看看什么原因,谢谢。

问题描述 使用C#在sqlite数据库中更新一条数据,当前应用程序中是有效的,当我关闭应用程序后,再次打开应用程序,查询,发现更改失败,请各位大神们看看什么原因,谢谢代码:sql="UPDATESchoolSETdelegate='北航'WHEREID=2";cmd.CommandText=sql;cmd.ExecuteNonQuery();表结构: 解决方案 本帖最后由 yyyy1999 于 2015-06-09 16:50:07 编辑解决方案二:你的cmd支持sqlite数据库吗?

c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入

问题描述 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入 c#实现批量插入数据到sql数据库表中,怎么做到跳过插入失败的数据,继续插入. 并且报错,哪几天数据失败了.和失败的原因. 我现在是可以生成一个把一个数据库表的数据导入到另一个数据库表中.但是呢,有些数据由于某个字段过长无法导入成功,而导致所有的都无法导入.直接造成导入失败.我 想过滤掉那条不成功的继续导入.不至于都导入不成功.急! 想和好久也没解决.网上也没找到说法 解决方案 数据库表插入数据失败数据库批量

数据结构中的线性表中的指针使用

问题描述 数据结构中的线性表中的指针使用 数据结构 单链表 类型定义: typedef struct lnode { elemtype data; struct lnode *next; }Lnode, *LinkList; int InitList(LinkList L)//构造一个空的线性表L { 构造一个空的线性表L *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) / 存储分配失败 / exit(OVERFLOW); (*L)->nex

select-winfrom中如何把SqlServer数据库表查询出来的数据插入access数据库表中

问题描述 winfrom中如何把SqlServer数据库表查询出来的数据插入access数据库表中 sqlserver里面的数据是根据条件查询出来的,现在是把查询出来的数据,给他导入到access数据库中,但是不知道在C#后台中怎么写 跨数据库去执行insert select,求解啊啊啊啊啊啊 解决方案 大概的代码 DataTable table = new DataTable() SqlConnection sqlconn = new SqlConnection(connectionStr);

vb6-vb 把数据输入到excel表中

问题描述 vb 把数据输入到excel表中 For m = 68 To 80 Step 3 For n = 12.6 To 16.2 Step 1.2 For o = 3.6 To 4.4 Step 0.2 For p = 210 To 275 Step 30 If m <> n And m <> o And m <> p And n <> o And n <> p Then Print m; n; o; p End If Next Next N

oracle修改一个表中的主键字段值,与其外键关联的另一个表中的相应字段值也改变

问题描述 oracle修改一个表中的主键字段值,与其外键关联的另一个表中的相应字段值也改变 oracle 中修改一个表中的主键字段值,与其外键关联的另一个表中的相应字段值也改变? 有如下两张表,表a和表b 表a 结构如下: ID Name age 1 lisi 18 2 wangwu 21 3 sunliu 34 4 yiliu 24 ... ... ... 其中ID字段为表a主键且自增 表b结构如下: CID CNAME ID 1 aaaaa 1 2 bbbbb 2 3 cccccc 4 4

c++怎样从txt文档中读取数据写入到三维矩阵中

问题描述 c++怎样从txt文档中读取数据写入到三维矩阵中 用MATLAB获取了一幅彩色图像的像素值,得到一个400*300*3的三维矩阵,并保存到txt文档中,怎么写一个c++小程序,把txt中的数据写入到一个三维矩阵中? %读取第k个图像,所有像素 srcImg = imread(fullfile(SRC, srcName)); %保存像素值到txt文档,便于C++测试使用 fid = fopen('JPEG2TXT.txt', 'wt+'); if fid == -1, return, e