2010-07-01 138 views
0

我在我的C#应用​​程序中使用强类型数据集,我希望能够记录用户对行进行的任何更改。做这个的最好方式是什么?日志记录数据库行更改

回答

0

是否希望能够访问C#应用程序中的更改?或者这仅仅是为了记录/审计目的?您的强类型数据集是映射到SQL Server表的XSD数据集吗?

触发SQL服务器

在一个大的订货系统,我帮世邦魏理仕开发上,我们创造了额外的表来保存版本的数据。假设你有一张请求表。创建一个Request_changes表。然后,您为INSERT和UPDATE触发器是这样的:

CREATE TRIGGER [dbo].[tr_Request_update] 
ON [dbo].[Request] 
FOR UPDATE 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     etc 
    ) 
    SELECT 
     'UPDATE', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

create TRIGGER [dbo].[tr_Request_insert] 
ON [dbo].[Request] 
FOR INSERT 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     Title, 
     etc 
    ) 
    SELECT 
     'INSERT', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

您不必访问_changes表(除非其映射到另一个XSD数据集),但它是伟大的记录和审计和跟踪降低错误和历史。

其他选项

也许你有没有被持久性存储支持,如SQL服务器的XSD数据集,你仅仅使用在内存中的数据集。有很多其他设计模式和众所周知的构造可以在属性值发生变化时通知您。

另外,如果您使用的是XSD数据集,是因为您正在使用现有的代码库还是遗留应用程序?如果你正在做新的发展,我会摆脱它们。这是MS不再积极发展的一种老技术。如果你想留在当前版本的Visual Studio附带的MS堆栈中,你最好的选择是Linq to Sql或Entity Framework,这两者应该更容易处理,并且更灵活(例如,我不喜欢认为XSD数据集非常好地处理空值,并且它们不支持生成的类中的.NET可空类型)。

+0

这是一个遗留系统,正在进行用户审计改造。它目前具有基于RowChanged事件的日志记录,但它有问题,并且不总是记录。我正在寻找更好的解决方案,以适应所有更改(访问可能不是必需的),只要我可以在应用程序中查看它就可以了。系统拥有自己的用户帐户,但使用系统用户帐户应该没问题。你喜欢多解释一下自己还是把我和某些东西联系起来? – Malfist 2010-07-01 20:45:05

+0

触发器可能在你的情况下工作得很好。这个应用程序是否支持SQL Server?您甚至可以创建XSD数据集来映射单个[tableName] _changes表,因此您可以轻松地将更改的数据拖到您的应用程序,审计页面或任何其他位置。 – 2010-07-01 21:02:55