问题:
有许多不同的数据库,由许多不同的应用程序直接填充(没有任何公共应用程序层)。只能通过 SP 访问数据(按策略)
任务:
应用程序需要跟踪这些数据库中的变化并在最短的时间内做出反应。
可能的解决方案:
1)为每个数据库中的每个表创建触发器,这将用事件填充一个表。应用程序将通过 SqlDependency 监视此表。
2)通过SqlDependency监视每个数据库中的每个表。
3)为每个数据库中的每个表创建触发器,这将通知使用托管扩展的应用程序。
哪个是最好的方法?
问题:
有许多不同的数据库,由许多不同的应用程序直接填充(没有任何公共应用程序层)。只能通过 SP 访问数据(按策略)
任务:
应用程序需要跟踪这些数据库中的变化并在最短的时间内做出反应。
可能的解决方案:
1)为每个数据库中的每个表创建触发器,这将用事件填充一个表。应用程序将通过 SqlDependency 监视此表。
2)通过SqlDependency监视每个数据库中的每个表。
3)为每个数据库中的每个表创建触发器,这将通知使用托管扩展的应用程序。
哪个是最好的方法?
这可能是一个广泛的话题。首先:使用的SQL Server版本是什么?
如果您使用的是 SQL 2008,则更改数据捕获是首选工具 此新功能使您能够监控SQL 2008 中对数据库所做的每一次更改。这包括DDL 更改以及对数据的更改。在这里查看介绍。
如果您使用的是旧版本的 SQL 2008 并且您被允许修改数据库的 DDL ,则选项 3将是您所描述的选项之一。不过我不推荐它,因为还有其他事情需要考虑,比如当事务回滚时会发生什么,或者当批量插入时触发器被停用时会发生什么?
在所有这些情况下让您的解决方案正常工作将是一个安静的挑战。
您可以采用的另一种方法是查看事务日志文件。这种方式是迄今为止最好的,但也是最复杂的方式,因为几乎没有关于专有日志格式的文档。它还绑定到特定版本的 SQL Server。这将导致对所选数据库的无影响监控。
另一种方法是创建要监控的数据副本,并定期检查是否存在差异。这样做的好处是不必对源数据库进行任何更改。以及摆脱事务或批量插入问题。由于最迟在下一次监控运行时,您将能够发现更改。
性能影响相当小,因为它只需要对要监视的表进行主索引连续读取。这是迄今为止与数据库交互的最优化方式。然而,这种方法将需要相当多的开发工作。我必须知道,因为这是我自去年以来的主要关注点。在这里检查;)
(我希望链接没问题,在这种情况下,因为它是主题,否则我将其删除)
您不查看使用 SQL 分析器的可能性吗?使用过滤器,您可以只选择更新操作,然后写入日志。
您可以使用 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。希望这可以帮助。