SQL Server 判断字段是否被更新 新旧数据写入Audit Log表中
2022-11-12 09:50:03
内容摘要
这篇文章主要为大家详细介绍了SQL Server 判断字段是否被更新 新旧数据写入Audit Log表中,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记
文章正文
这篇文章主要为大家详细介绍了SQL Server 判断字段是否被更新 新旧数据写入Audit Log表中,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。还要创建另外一个表[Audit],就是存储跟踪记录的表:代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <code> 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 </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <code> --@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 </code> |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <code> 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) </code> |
注:关于SQL Server 判断字段是否被更新 新旧数据写入Audit Log表中的内容就先介绍到这里,更多相关文章的可以留意
代码注释