代码之家  ›  专栏  ›  技术社区  ›  Lusid

对小型桌面应用程序使用变更数据捕获?

  •  2
  • Lusid  · 技术社区  · 16 年前

    我的一个新客户在2002年编写了一个小型的vb/access数据库应用程序,他希望通过重写来更新它,并支持他一直想要的新功能。因此,我将把它转换为在本地计算机上使用C.NET 2008和SQL Server Express 2008,并能够扩展到在远程服务器上使用WCF和SQL Server 2008。

    他感兴趣的新功能之一是维护和报告一段时间内数据更改的完整历史记录。在过去,我是通过使用触发器和存储过程来做到这一点的,这在@中是一种痛苦!一美元。

    最近我有点发痒,想把SQL Server2008的变更数据捕获功能搞得一团糟。在我开始玩它的时候,我意识到它在SQL代理中创建了一个作业,默认每5秒运行一次。当我需要更改捕获的表的模式时,这似乎也有点麻烦。除此之外,它似乎比我的原始方法更容易实现。所以,我的问题是:

    1. 对于一个小型桌面应用程序来说,这是不是太危险了?该应用程序可能最终会迁移到远程服务器,也可能不会迁移到远程服务器上?
    2. 在性能方面我应该期待什么?随着他的数据库容量的增加,我是否会接到更多他打来的电话,说他的计算机运行缓慢?
    3. 我是否应该从目前生产中使用CDC的任何人那里了解到其他与CDC有关的问题?
    4. 是否有人有任何链接指向他们最喜欢的跟踪随时间变化的方法,这可能更适合小型桌面应用程序?

    谢谢,

    马克

    3 回复  |  直到 15 年前
        1
  •  2
  •   Mladen Prajdic    16 年前

    CDC仅在SQL Server企业版中可用。所以,如果你有了express,你就不能使用它了,你必须使用触发器。

        2
  •  1
  •   Ian Varley    16 年前

    虽然触发器在许多方面都很难使用,但是您可以在透明的数据审计历史机制上使用它们层,而不会对主代码库产生任何影响,方法是编写实际 生成 触发器和历史记录表自动。这是一个相当多的工作,我不知道有谁做过这样的工作,并且公开了源代码,但这可能是一个有趣的项目。至少这样,您可以编写一个生成器过程,然后再也不必处理单个触发器。

        3
  •  1
  •   Timothy Walters    15 年前

    我使用了我自己的变更数据跟踪系统,在我的变更表中使用了一个XML列,这使得它更加灵活。也使得触发器相当通用。

    假设您已经有了创建审计行的触发器,并且源表中有一个名为“version”的列,类型为rowversion:

    INSERT INTO [Changes].Sites
    (
        SiteID,
        Operation,
        Version,
        ModifiedOn,
        DataChange
    )
    SELECT
        IsNull( I.SiteID, D.SiteID ),
        CASE
            WHEN D.[Version] IS NULL      AND I.[Version] IS NOT NULL  THEN 'I'
            WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NOT NULL  THEN 'U'
            WHEN D.[Version] IS NOT NULL  AND I.[Version] IS NULL      THEN 'D'
            ELSE '?'
        END,
        IsNull( I.Version, D.Version ),
        SysDateTimeOffset(),
        (
            SELECT
                [Deleted] = ( SELECT * FROM deleted D1 WHERE D1.SiteID = D.SiteID FOR XML PATH(''), TYPE ),
                [Inserted] = ( SELECT * FROM inserted I1 WHERE I1.SiteID = I.SiteID FOR XML PATH(''), TYPE )
            FOR XML PATH('Changes')
        )
    FROM deleted D
    FULL JOIN inserted I
        ON D.SiteID = I.SiteID
    

    该查询中唯一特定于我的表的是主键。生成用于创建这些查询的模板相当简单(甚至可以使用sys.tables等在SQL中进行)。