【问题标题】:Design considerations for monitoring SQL database table changes监控 SQL 数据库表更改的设计注意事项
【发布时间】:2012-04-25 17:41:56
【问题描述】:

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

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

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

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

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

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

想法?

【问题讨论】:

    标签: c# .net sql sql-server-2008 c#-4.0


    【解决方案1】:

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

    您还应该研究其他一些原生技术:

    更改跟踪
    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 方解决方案(我没有使用任何解决方案,所以我会留给您搜索/研究)。

    【讨论】:

    • 感谢您的快速回复!也许你是对的。当然,在这种情况下(根据我的研究),我认为触发器会非常简单。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2012-11-29
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多