【问题标题】:Using Change Data Capture for Small Desktop Applications?对小型桌面应用程序使用变更数据捕获?
【发布时间】:2009-01-22 16:47:34
【问题描述】:

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

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

我最近很想弄乱 SQL Server 2008 的变更数据捕获功能。在我最初使用它的一个小时内,我意识到它会在 SQL 代理中创建一个默认情况下每 5 秒运行一次的作业。当我需要更改捕获表的架构时,这似乎也有点痛苦。除此之外,它似乎比我原来的方法更容易实现。所以,这些是我的问题:

  1. 对于最终可能会或可能不会迁移到远程服务器的小型桌面应用程序来说,这是否有点矫枉过正?
  2. 在性能方面我应该期待什么?随着他的数据库大小增加,我是否会收到更多来自他的电话,说他的计算机运行缓慢?
  3. 对于目前在生产中使用它的任何人,我是否应该注意 CDC 的任何其他问题?
  4. 有没有人有任何链接指向他们最喜欢的跟踪随时间变化的方式,这种方式可能更适合小型桌面应用程序?

谢谢,

马克

【问题讨论】:

  • 好问题...我想调查一下,因为更改跟踪是如此痛苦。

标签: sql-server sql-server-2008 change-data-capture


【解决方案1】:

CDC 仅在 SQL Server 企业版中可用。因此,如果您有 express 则无法使用它,您将不得不使用触发器。

【讨论】:

  • 啊……我在看这个页面:msdn.microsoft.com/en-us/library/bb522489.aspx 我认为“在评估版中支持”是指 Express。这对我来说已经足够了。在需要扩展到远程服务器之前,我怀疑他们是否会为此应用购买完整版。
【解决方案2】:

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

【讨论】:

  • 这是一个有趣的想法。我之前考虑过这一点,并得出结论,用 SQLCLR 编写的触发器可能会在自动化一些需要完成的重复脚本编写方面发挥作用,但后来我开始考虑每次插入的动态处理有多慢.
【解决方案3】:

我使用我自己的更改数据跟踪系统,在我的更改表中使用 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 中完成)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多