代码之家  ›  专栏  ›  技术社区  ›  Yauheni Sivukha

如何从.NET应用程序跟踪许多SQL Server数据库中的更改?

  •  7
  • Yauheni Sivukha  · 技术社区  · 15 年前

    问题:

    有很多不同的数据库,由许多不同的应用程序直接填充(没有任何公共应用程序层)。只能通过SP访问数据(按策略)

    任务:

    应用程序需要跟踪这些数据库中的更改,并在最短时间内做出反应。

    可能的解决方案:

    1)为每个数据库中的每个表创建触发器,它将用事件填充一个表。应用程序将通过sqldependency监视此表。

    2)通过sqldependency查看每个数据库中的每个表。

    3)为每个数据库中的每个表创建触发器,它将使用托管扩展通知应用程序。

    哪种方法最好?

    3 回复  |  直到 10 年前
        1
  •  5
  •   ntziolis    15 年前

    这可能是一个广泛的话题。首先:使用的是什么SQL Server版本?

    如果您使用的是SQL 2008 更改数据捕获 是选择的工具 此新功能使您能够监视 每个 对SQL 2008中的数据库所做的更改。这包括 DDL变化 以及 对数据的更改 . 查看简介 here .

    如果您使用的是旧版本的SQL 2008,并且允许您 修改DDL 数据库的 选项3 将是(你曾经描述过的)选择之一。不过,我不建议这么做,因为还有其他事情要考虑,比如 事务回滚 或者什么时候 批量插入时触发器被停用 例如?

    在所有这些情况下,让您的解决方案正常工作将是一个安静的挑战。

    另一种方法是看 事务日志 文件。这条路是目前为止最好的,但是 最复杂的方式 因为几乎没有关于专有日志格式的文档。它还绑定到特定版本的SQL Server。这将导致 无冲击 监视所选数据库。

    另一种方法是创建 数据的副本 这将受到监控,并定期检查是否存在差异。 这样做的好处是 未更改源数据库 一定要做。以及摆脱事务或批量插入问题。因为最迟在下次监视运行时,您将能够发现更改。

    性能影响相当小,因为它只需要对要监视的表进行主索引连续读取。这是迄今为止与数据库交互的最优化方式。 然而,这种方法将需要相当多的开发工作。我必须知道,因为这是我过去几年的主要工作。检查 here ;)

    (我希望链接是可以的,在这种情况下,因为它的主题,否则我删除它)

        2
  •  0
  •   Dewfy    15 年前

    不要回顾使用SQL事件探查器的可能性。使用筛选器,您只能选择更新操作,然后选择写入日志。

        3
  •  0
  •   dyatchenko    10 年前

    您可以使用sqldependency类的开源实现- SqlDependencyEx . 它使用数据库触发器和本机ServiceBroker通知来接收有关表更改的事件。这是一个使用示例:

    int changesReceived = 0;
    using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
              TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
    {
        sqlDependency.TableChanged += (o, e) => changesReceived++;
        sqlDependency.Start();
    
        // Make table changes.
        MakeTableInsertDeleteChanges(changesCount);
    
        // Wait a little bit to receive all changes.
        Thread.Sleep(1000);
    }
    
    Assert.AreEqual(changesCount, changesReceived);
    

    使用sqldependecyex,您可以只监视insert或delete,避免更新。希望这有帮助。