7

问题:

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

任务:

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

可能的解决方案:

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

2)通过SqlDependency监视每个数据库中的每个表。

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

哪个是最好的方法?

4

3 回答 3

5

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

如果您使用的是 SQL 2008,则更改数据捕获是首选工具 此新功能使您能够监控SQL 2008 中对数据库所做的每一次更改。这包括DDL 更改以及对数据的更改。在这里查看介绍。

如果您使用的是旧版本的 SQL 2008 并且您被允许修改数据库的 DDL ,则选项 3将是您所描述的选项之一。不过我不推荐它,因为还有其他事情需要考虑,比如当事务回滚时会发生什么,或者当批量插入时触发器被停用时会发生什么?

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

您可以采用的另一种方法是查看事务日志文件。这种方式是迄今为止最好的,但也是最复杂的方式,因为几乎没有关于专有日志格式的文档。它还绑定到特定版本的 SQL Server。这将导致对所选数据库的无影响监控。

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

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

(我希望链接没问题,在这种情况下,因为它是主题,否则我将其删除)

于 2010-04-22T08:48:49.107 回答
0

您不查看使用 SQL 分析器的可能性吗?使用过滤器,您可以只选择更新操作,然后写入日志。

于 2010-04-22T08:26:03.537 回答
0

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

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,避免 UPDATE。希望这可以帮助。

于 2015-02-23T12:25:48.717 回答