【问题标题】:Monitor SQL Server for new row监视 SQL Server 的新行
【发布时间】:2010-08-10 13:09:11
【问题描述】:

我正在创建一个应用程序,如果新行已添加到应用程序数据库中的表中,它会通知用户。最好为此创建一个触发器,还是直接从应用程序中每隔几秒钟检查一次?想法?

【问题讨论】:

    标签: sql sql-server vb.net


    【解决方案1】:

    使用Query Notifications。这是 SQL Server 功能,允许在其他用户更改数据时主动向客户端推送通知。它更好地称为 SqlDependency。您订阅查询,并在结果集发生更改(添加、删除或修改行)时收到通知。

    例如。使用LinqToCache 查询并对失效通知做出反应:

    var query = (from r in ctx.table select r).AsCached(
     "table", new CachedQueryOptions() {
        OnInvalidated = (sender, args) {
          // the query was invalidated, a new row was added!
          // refresh display or notify user
        }
     });
    DisplayRows(query);
    

    【讨论】:

      【解决方案2】:

      触发器是一个更好的主意。

      【讨论】:

        【解决方案3】:

        触发器将如何绕过轮询的需要?

        顺便说一句,sql-server 有一个通知服务 - 但它可能有点矫枉过正

        您可以使用触发器将非常短的通知记录写入另一个表,并轮询该表而不是主表

        【讨论】:

        • 这个表在文件上传完成后由 FTP 服务器更新,我预计一天最多只有三到四次插入。 sql server 通知服务是容易理解还是学习曲线不值得这个单一的要求?
        • @madlan - 见 Remus 的回答 ;-)
        【解决方案4】:

        触发器是在添加新行时捕获的最佳方法。

        但是,在通知用户方面,这取决于您需要如何通知用户。您仍然需要监视数据库。因此,您最好保持您的应用程序不变。

        如果最初的轮询计数很密集,您当然可以让触发器更新数据库中其他地方的值。

        【讨论】:

        • 我有多个需要通知的客户端 - 如果执行此客户端,每个客户端都需要通知一次。 (我在应用程序系统托盘图标上使用气球提示)我正在考虑在表中添加一个额外的列,应用程序将附加一个唯一值(例如系统名称)以表示该行已被“气球化”客户。这也可以省去在本地存储已处理行的列表。
        【解决方案5】:

        触发器是在数据库中执行的东西,因此您需要做一些工作才能让触发器将通知发送回正在运行的应用程序。

        如果您改为从应用程序进行轮询(每隔几秒或每分钟一次或其他方式),您可以控制向用户发送通知的频率。例如,这可以防止由于添加了数千个新行而导致用户收到数千封电子邮件的情况。

        【讨论】:

          猜你喜欢
          • 2011-03-01
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-13
          • 1970-01-01
          • 2010-09-08
          相关资源
          最近更新 更多