记录数据库行更改

时间:2010-07-01 18:59:03

标签: c# logging strongly-typed-dataset .net-3.5

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

1 个答案:

答案 0 :(得分:0)

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

在SQL服务器上触发

在我在CB Richard Ellis帮助开发的大型订购系统中,我们创建了额外的表来保存版本化数据。假设您有一个Request表。创建一个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数据集),但它非常适合记录和审核以及跟踪错误和历史记录。

其他选项

也许你有一个XSD数据集,它不是由持久存储(如SQL服务器)支持的,而你只是在内存数据集中使用。当属性值发生变化时,还有许多其他设计模式和众所周知的结构可以通知您。

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