【问题标题】:How to automatically find out or get notified when a SQLServer's table data is modified如何在 SQLServer 的表数据被修改时自动发现或得到通知
【发布时间】:2017-01-12 15:38:32
【问题描述】:

我在 StackOverflow 中遇到了一些与此主题相关的问题,但大多数都没有得到解答。 使用 SQLServer、ASP.NET MVC。

我有多个表(T1、T2、T3、T4、T5),当表 T1、T2、T3、T4 中的数据被修改时,我必须更新表 T5 中的时间戳。 例如:T2 是包含所有国家信息的国家表 T3 是包含所有部件描述的键盘表。 T4是电视屏幕表,有所有零件说明。
T1,T5 是包含上述表的信息的表,LookupName,DataAdded,DataModified。 (FirstRow 将是 Country、DateAdded、DateModified 等) T1还有一个像enable这样的附加列,即N,那么我们将删除T5表中对应的条目。

如果 T1,T2,T3,T4 中的任何数据发生更改(从 UI 或直接从 sqlserver),我必须更新 T5 中相应的行时间戳列。

我不需要监视 T1 表的所有行的数据更改,因为它具有我不需要跟踪更改的行数据。

我曾想过使用触发器,但有人告诉我这会妨碍性能,我的领导不满意,他想知道无论如何我们可以在 T1、T2、T3、T4 中的数据时获得信号或通知类型被修改了。

有人可以帮忙吗?

【问题讨论】:

  • 您是在查询中使用纯 SQL 还是使用任何 ORM?
  • @KD 我们将 BLToolKit 用于 ORM。
  • @LasseV.Karlsen 是的,我目前正在研究 SqlDependecy。在类似的问题之一中遇到了它。谢谢。
  • 一些线程在没有像这样的正确答案的情况下被关闭。 link

标签: sql-server asp.net-mvc database monitoring


【解决方案1】:

如果没有仔细编写和测试触发器,它们可能会导致性能问题。也就是说,触发器是一种强大的工具,不应完全排除。这种模式效果很好……

CREATE TRIGGER [dbo].[trg_T1]
    ON [dbo].[T1] --Repeat this pattern for T2, T3 & T4
    FOR UPDATE NOT FOR REPLICATION
    AS
BEGIN;
    SET NOCOUNT ON;

    UPDATE T5
        SET DataModified = GETDATE()
        FROM dbo.T5
            INNER JOIN DELETED
                ON T5.ID = DELETED.ID;
END;

我应该强调测试这段代码的重要性(用于性能和行为),因为我无法访问您的数据,所以我没有这样做。但希望你明白了吗?

【讨论】:

  • 我向我的领导提出了这个想法,他根本不想使用触发器。他想要一些其他的选择。
  • 另一种方法是针对 T1、T2...T4 中的行存储 DataModified 日期。然后,您可以为 UNION ALL 创建一个 VIEW,最后按 T1 的主键 ID 分组。根据需要聚合 DataModified(例如 MAX(DataModified)。本质上是即时计算日期。这将不需要 TRIGGER,但显然读取日期会更慢。更重要的是什么?快速读取还是快速写入?
  • 我很抱歉@NickAllan。忘了提到另一件事,作为主表的 T1 表由我不需要跟踪数据更改的其他行组成。所以我的领导要求不要在 T1 中添加 DateColumn。
  • 您可以考虑使用“更改跟踪”,这是 SQL Server 旨在处理此类问题的一个功能。我以前没有理由使用它,但是网上有很多可用的信息。例如。 mssqltips.com/sqlservertip/1819/…
  • 谢谢,将通过您提供的链接。
猜你喜欢
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2019-04-12
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
相关资源
最近更新 更多