审核表中更改的最佳方法

本文关键字:最佳 方法 | 更新日期: 2023-09-27 17:59:52

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

在设计中,我需要能够维护版本,以检查用户对表所做的所有更改。有人能提出实施这一要求的最佳方式吗。

非常感谢。

审核表中更改的最佳方法

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

变更数据捕获是专门为这个问题设计的。

如果你不想启用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

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

这将在审核表中为您提供当前+历史记录(从而简化报告)。Version列使您可以在Table1和Table1_History之间轻松查找,如果您想知道当前行的确切审核详细信息更新由审核中同时发生的DELETE(D)和INSERT(I

如果您谈论的是数据库表,那么最好不要从中删除数据。您应该在表中设置一个flag列,表示在相应行中执行的操作。

对于活动行,您可以将其设置为0,如果该行已删除,则可以将其设为1。因此,基本上,您将在删除一行的同时执行Update操作。其他CRUD操作也可以遵循相同的操作。