0

我正在执行一项任务,以监视和记录我们的多层 .NET 4 WPF、WCF、SQL 2008 应用程序中的各种“系统级消息”。通过消息,我的意思是有关我们应用程序中发生的事件的详细信息,例如用户登录和注销或保存数据。通过记录,我的意思是将消息插入到轻量级 SQL 表中,客户端可以从中轮询并显示最新消息。

这些消息的来源可能来自我们应用程序中的几个不同组件,例如 Windows 服务、IIS 中的 WCF 主机,甚至数据库中的存储过程。最终,这些组件以各自的方式修改 SQL 表。因此,与其单独攻击这些组件中的每一个,我想我可以通过说当 SQL 中的某些表被修改(更新、插入)时需要“触发”消息来简化事情。

首先想到的是每个表上的触发器,它监视更改并将记录插入到轻量级消息表中。我一直(99% 的时间)认为数据库触发器是坏消息(数据库触发器是邪恶的吗?)。我个人更愿意开发和调试 C# 而不是 SQL 触发器。

因此,在寻找替代方案时,我遇到了Using SqlDependency to Monitor Database Changes,其中讨论了使用 SqlDependency 类来检测更改。快速的概念证明似乎有效;但是,在查看了几个代码示例之后,似乎每次检测到更改时,都必须重新初始化新的 SqlConnection、SqlCommand 和 SqlDependency 对象,并且我可能需要 3 或 4 个需要监控的查询。

在 C# 中检测 SQL 表的更改是否有更好的选择?

此外,除了触发偏差之外,这似乎是一种迂回的方式来简单地监控一组表中的变化,只是为了将数据重新插入另一个表。还有一些其他的逻辑需要发生,我宁愿在 C# 中实现,但我应该只编写触发器来执行此操作并完成它吗?

想法?

4

1 回答 1

0

我认为您对触发器的偏见总体上是没有根据的。人们看不起触发器的原因与他们看不起光标的原因相同:在许多情况下,它们被误用和滥用。但就像很多东西一样,它们当然有自己的位置,如果使用得当,它们就是正确的答案。

您还应该研究其他一些本机技术:

更改跟踪
http://msdn.microsoft.com/en-us/library/cc280462(SQL.100).aspx

更改数据捕获
http://msdn.microsoft.com/en-us/library/bb522489(SQL.100).aspx

SQL Server 审计
http://msdn.microsoft.com/en-us/library/cc280386(SQL.100).aspx

虽然我不知道您的版本(其中一些是企业功能)。也存在一些第 3 方解决方案(我没有使用任何解决方案,所以我将由您自行搜索/研究)。

于 2012-04-25T17:52:01.390 回答