首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否检查对SQL Server表的更改?

是否检查对SQL Server表的更改?
EN

Stack Overflow用户
提问于 2008-08-01 12:35:57
回答 7查看 70K关注 0票数 150

如何在不使用触发器或以任何方式修改数据库结构的情况下监视表的更改?我首选的编程环境是.NET和C#。

我希望能够支持任何SQL Server 2000 SP4或更高版本。我的应用程序是另一家公司产品的数据可视化插件。我们有数以千计的客户,所以我不想要求我们在每次安装时都要修改第三方供应商的表。

我所说的“对表的更改”是指对表数据的更改,而不是对表结构的更改。

最终,我希望更改在我的应用程序中触发一个事件,而不是必须每隔一段时间检查更改。

根据我的要求(没有触发器或模式修改,SQL Server2000和2005),最好的做法似乎是使用T-SQL中的BINARY_CHECKSUM函数。我计划实现的方式是:

每隔X秒运行一次以下查询:

代码语言:javascript
复制
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

并将其与存储值进行比较。如果值已更改,请使用以下查询逐行检查表:

代码语言:javascript
复制
SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

并将返回的校验和与存储的值进行比较。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-08-02 05:20:22

看一下CHECKSUM命令:

代码语言:javascript
复制
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

只要表内容没有改变,它每次运行时都会返回相同的数字。有关更多信息,请参阅我的帖子:

CHECKSUM

下面是我如何在表更改时使用它来重新构建缓存依赖关系:

ASP.NET 1.1 database cache dependency (without triggers)

票数 100
EN

Stack Overflow用户

发布于 2008-08-01 13:07:53

为什么不想使用触发器呢?如果你正确地使用它们,它们是一件好事。如果您使用它们作为一种强制引用完整性的方法,那就是当它们从好变坏时。但如果你将它们用于监控,它们并不是真正的禁忌。

票数 24
EN

Stack Overflow用户

发布于 2008-08-03 13:59:24

您需要多久检查一次更改,以及数据库中的表有多大(就行大小而言)?如果您使用John建议的CHECKSUM_AGG(BINARY_CHECKSUM(*))方法,它将扫描指定表的每一行。NOLOCK提示很有帮助,但是在大型数据库中,您仍然会命中每一行。您还需要存储每一行的校验和,这样您才能知道其中一行已更改。

你有没有考虑过从不同的角度来做这件事?如果您不想修改模式来添加触发器(这是有道理的,它不是您的数据库),您是否考虑过与制造数据库的应用程序供应商合作?

他们可以实现一个API,提供一种机制来通知附件应用程序数据已经更改。它可以像写入通知表一样简单,该通知表列出了修改了什么表和哪一行。这可以通过触发器或应用程序代码来实现。从你的角度来看,这并不重要,你唯一关心的就是定期扫描通知表。对数据库性能的影响将远远小于扫描每一行的更改。

困难的部分将是说服应用程序供应商实现此功能。由于这完全可以通过SQL通过触发器来处理,因此您可以通过编写和测试触发器,然后将代码提供给应用程序供应商来为它们完成大部分工作。通过让供应商支持触发器,可以防止您添加触发器时无意中替换了供应商提供的触发器的情况。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档