审核表中更改的最佳方法

时间:2015-06-26 16:09:19

标签: c# asp.net .net sql-server

我正在设计一个 .NET 应用程序,用户可以从一个从表中获取数据的DataGrid元素中复制,编辑,更新或删除记录。

在设计中,我需要能够维护版本以检查用户对表所做的所有更改。有人可以建议实施此要求的最佳方法。

非常感谢。

2 个答案:

答案 0 :(得分:2)

正如Sean Lange所说,这是一个复杂的话题,没有灵丹妙药。

Change Data Capture是针对此问题明确设计的。

如果你不想启用CDC,那么触发器通常是你最好的选择。

以下是使用rowversion\timestamp审核触发器的示例:

CREATE TABLE [dbo].[Table1](
    [Id] [int] NOT NULL,
    [Data] [nvarchar](50) NULL,
    [Version] [timestamp] NOT NULL,
 CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
    [Id] 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

CREATE TABLE [dbo].[Table1_History](
    [Id] [int] NOT NULL,
    [Data] [nvarchar](50) NULL,
    [Version] [binary](8) NOT NULL,
    [ModDate] [datetimeoffset](7) NOT NULL,
    [ModUser] [nvarchar](50) NOT NULL,
    [Operation] CHAR(1) NOT NULL
    ) ON [PRIMARY]

GO

CREATE TRIGGER [dbo].[trgTable1_History] 
   ON  [dbo].[Table1]
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @now DATETIMEOFFSET(7) = SYSDATETIMEOFFSET()
    INSERT INTO dbo.Table1_History
    (Id, Data, Version, ModDate, ModUser, Operation)
    SELECT Id, Data, Version, @now, SYSTEM_USER, 'I' from inserted 

    INSERT INTO dbo.Table1_History
    (Id, Data, Version, ModDate, ModUser, Operation)
    SELECT Id, Data, Version, @now, SYSTEM_USER, 'D' from deleted 

END

时间戳列会在每次更改行时自动更新。

这为您提供了审计表中的当前+历史记录(简化了报告)。如果您想知道当前行的确切审计详细信息,则“版本”列可让您在Table1和Table1_History之间轻松查找。 更新由审核中同时发生的DELETE( D )和INSERT( I )指定。

答案 1 :(得分:-1)

如果您正在谈论数据库表,那么实际上永远不会从中删除数据是最佳做法。您应该在表中设置一个flag列,表示在相应行中执行的操作。

如果删除了行,您可以将活动行设置为01。因此,基本上,您将在删除行时执行Update操作。其他CRUD操作也可以遵循相同的步骤。