如何在不使用触发器或以任何方式修改数据库 struct 的情况下监视SQL Server数据库中的表更改?我喜欢的编程环境是.NET和C#.

我希望能够支持任何SQL Server 2000 SP4或更新版本.我的应用程序是另一家公司产品的一个螺栓连接数据可视化.我们的客户群有数千人,所以我不想要求我们在每次安装时修改第三方供应商的表格.

我所说的"changes to a table"是指对表数据的更改,而不是对表 struct 的更改.

最终,我希望更改能够触发应用程序中的事件,而不是每隔一段时间判断更改.


考虑到我的需求(没有触发器或模式修改,SQL Server 2000和2005),最好的做法似乎是在T-SQL中使用BINARY_CHECKSUM函数.我计划实施的方式是:

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

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM sample_table
WITH (NOLOCK);

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

SELECT row_id, BINARY_CHECKSUM(*)
FROM sample_table
WITH (NOLOCK);

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

推荐答案

看看CHECKSUM命令:

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM sample_table WITH (NOLOCK);

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

CHECKSUM

Here's how I used it to rebuild cache dependencies when tables changed:
ASP.NET 1.1 database cache dependency (without triggers)

Sql相关问答推荐

使用SQL/R循环查找邻居

Select 最大值,但当并列时,从其他列 Select 最大值

SQL—如何根据2列填写缺失的值

使用Lead获取下一个不同的日期

如何在SQL中更新Json字符串

SQL:如何在表中同时使用GROUPING和CONDITION?

找到最新的连线

我可以在SQLite3中使用BLOB作为主键吗?

来自按PostgreSQL分组的最小日期

postgres中的条件索引和触发器

在 Postgres 中将结果按几十年划分

从每月生成的系列中生成每日汇率

使用 union 的有序结果获取行数

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

在 postgres 中插入或更新 jsonb 数组的对象

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

如何使用Informix创建一个临时表,将数据从根表导入并使用筛选条件

Postgres更新增量之间的差异

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

具有关联统计信息 N+1 的 Rails 6 索引资源?