我正在设计一个 .NET 应用程序,用户可以从一个从表中获取数据的DataGrid
元素中复制,编辑,更新或删除记录。
在设计中,我需要能够维护版本以检查用户对表所做的所有更改。有人可以建议实施此要求的最佳方法。
非常感谢。
答案 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
列,表示在相应行中执行的操作。
如果删除了行,您可以将活动行设置为0
,1
。因此,基本上,您将在删除行时执行Update
操作。其他CRUD
操作也可以遵循相同的步骤。