如果删除了触发器,则SqlTableDependency不会注意到

时间:2017-05-31 16:41:34

标签: c# sql sql-server sqldependency

我们正在使用在Windows服务中运行的SqlTableDependency来监视对一组表的更改。

但是,由于某些数据库进程,触发器正在被删除。发生这种情况时,SqlTableDependency不会注意到这一点,因此恢复功能的唯一方法是重新启动Windows服务,这样库就可以再次创建所有对象。

SqlTableDependency是否有任何方法能够检测到所需的对象(触发器,Messaqes,队列)丢失并重新创建它们,或引发某些事件或抛出异常,因此系统可以检测到这一点并尝试重新启动服务?

谢谢!

1 个答案:

答案 0 :(得分:0)

AFAIK SqlTableDependency为您提供了一些安全脚本来清理其必要的数据库对象,以防出现在DB中的那些对象出错(check out 'Under The Hood' section in their documentation)。 使用这些脚本您可以:

  1. 确定您的特定依赖项所需的对象清单(使用SqlTableDependency的内部名称约定,例如触发器将是' tr_ [schema] [monitorizedTable] [来自SqlTableDependency的指南] &#39)
  2. 在sys表上实现检查功能,以检查从第1点开始的检查表是否为完全填充
  3. 如果核对表未填满,则执行必要的操作(例如,创建必要的缺失对象或重新启动服务)
  4. 这不是要添加到SqlTableDependency的一般实现,因为它可能会绑定到您的特定上下文,对于第3点,您还需要更高的DB权限,但我认为这是一种方法来解决您的用例在系统的这一部分具有一定的弹性。

    只是提供一个示例,这是我使用nhibernate会话的一个类似的方法(...仅限于检查触发器的示例,并且应该使用正则表达式强制执行...)

        public bool CheckDependencyAutomationIsAwakeOnTable(string tableName)
        {
            string q = string.Format("SELECT [name] FROM sys.triggers WHERE [name] like 'tr_%_{0}_%'", tableName);
    
            var query = Session.CreateSQLQuery(q);
    
            query.SetResultTransformer(Transformers.AliasToBean<SQLTableDependecyCheck>());
    
            var list = query.List<SQLTableDependecyCheck>();
            return list.Count() == 1;
    
        }
    
        private class SQLTableDependecyCheck
        {
            public SQLTableDependecyCheck()
            {
    
            }
            public string name { get; set; }
        }