监视SQL数据库表更改的设计注意事项

时间:2012-04-25 17:41:56

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

我正在进行一项任务,在我们的多层.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#中实现,但是我应该只编写触发器来完成这个并完成它吗?

思想?

1 个答案:

答案 0 :(得分: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

虽然我不知道你的版本(其中一些是企业版功能)。一些第三方解决方案也存在(我没有使用任何解决方案,所以我会留给你搜索/研究)。