审核表中更改的最佳方法
本文关键字:最佳 方法 | 更新日期: 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
操作也可以遵循相同的操作。