SqlDependency有什么限制

时间:2011-09-28 19:33:34

标签: c# sql-server-2005 sqldependency

我使用表作为消息队列,并使用SqlDependency“注册”以获取更新。我读到的每个地方的人都在说要注意它的局限性,但没有具体说明它们是什么。从我收集的内容来看,当表具有非常高的更新频率时,你会遇到问题,幸运的是我只看到每分钟最多10-20个值。

对SqlServer有哪些其他限制/影响?

6 个答案:

答案 0 :(得分:61)

我能找到的最完整的清单(from here)如下:

  • 必须明确声明SELECT语句中的预计列,并且必须使用两部分名称限定表名。请注意,这意味着语句中引用的所有表必须位于同一数据库中。
  • 该语句不能使用星号()或table_name。语法来指定列。
  • 该声明不得使用未命名的列或重复的列名。
  • 该语句必须引用基表。
  • 该语句不得引用具有计算列的表。
  • 除非语句使用GROUP BY表达式,否则SELECT语句中的投影列可能不包含聚合表达式。提供GROUP BY表达式时,选择列表可能包含聚合函数COUNT_BIG()或SUM()。但是,可能不会为可为空的列指定SUM()。该声明可能未指定HAVING,CUBE或ROLLUP。
  • SELECT语句中用作简单表达式的投影列不得出现多次。
  • 声明不得包含PIVOT或UNPIVOT运营商。
  • 声明不得包含UNION,INTERSECT或EXCEPT运算符。
  • 声明不得引用视图。
  • 声明不得包含以下任何内容:DISTINCT,COMPUTE或COMPUTE BY或INTO。
  • 该语句不得引用服务器全局变量(@@ variable_name)。
  • 该语句不得引用派生表,临时表或表变量。
  • 该语句不得引用其他数据库或服务器中的表或视图。
  • 该语句不得包含子查询,外连接或自连接。
  • 语句不得引用大对象类型:text,ntext和image。
  • 声明不得使用CONTAINS或FREETEXT全文谓词。
  • 该语句不得使用行集功能,包括OPENROWSET和OPENQUERY。
  • 声明不得使用以下任何聚合函数:AVG,COUNT(*),MAX,MIN,STDEV,STDEVP,VAR或VARP。
  • 声明不得使用任何非确定性函数,包括排名和窗口函数。
  • 该语句不得包含用户定义的聚合。
  • 该语句不得引用系统表或视图,包括目录视图和动态管理视图。
  • 声明不得包含FOR BROWSE信息。
  • 声明不得引用队列。
  • 该语句不得包含无法更改且无法返回结果的条件语句(例如,WHERE 1 = 0)。
  • 该语句无法指定READPAST锁定提示。
  • 该声明不得引用任何Service Broker QUEUE。
  • 声明不得引用同义词。
  • 声明不得基于双/实数据类型进行比较或表达。
  • 声明不得使用TOP表达式。

其他参考文献:

答案 1 :(得分:12)

除此之外,对于任何考虑使用SqlDependency接收有关更改通知的人,我一直在生产中使用这种方法,而且我发现它有问题。我正在研究它是否与我的代码有关,但主要问题是:

  • 如果您快速连续触发多个更改,则不会始终获得与代码相同数量的事件。在我的代码中,如果一个接一个地插入2个新记录,我只收到一个通知(对于最后一个)。

  • 无法知道添加的记录。因此,如果您添加新记录,并且代码触发以接收通知,则代码无法知道该新记录的ID,因此您需要在数据库中查询该记录。

答案 2 :(得分:9)

花了一天时间追逐SQL Service Broker无法正常工作的问题,根本原因是在存储过程中引用了数据库。

例如,这个select在SQL Management Studio中运行良好:

select [MyColumn] from [MyDatabase].[MySchema].[MyTable]

但是,SQL Service Broker拒绝了这一点,因为我们在select语句中引用了数据库,而来自SqlDependency的回调在Invalid中返回SqlNotificationEventArgs e,请参阅{{ 3}}

将传递给SqlDependency的SQL更改为以下语句消除了错误:

select [MyColumn] from [MySchema].[MyTable]

更新

上面的示例只是SQL Service Broker依赖的SQL语句的许多限制之一。有关限制的完整列表,请参阅http://msdn.microsoft.com/en-us/library/ms189308.aspx

原因? SQL Service Broker使用的SQL语句在后台转换为监视What are the limitations of SqlDependency数据库更改的指令。此监视在SQL Server的核心中执行,这使得在检测对表的更改时非常快。但是,这个速度是有代价的:你不能只使用任何SQL语句,你必须使用一个可以转换成指令来监视SQL Transaction Log

答案 3 :(得分:3)

我对此技术的另一个重大问题是:订阅者连接需要具有“创建过程”权限。我工作的应用程序的Web服务层目前作为受限用户运行。要使用SQLDependency设置通知,我必须打开该用户来创建过程。听起来像是在拥有自己的道路上迈出了相当不错的一步。

答案 4 :(得分:2)

要克服这些限制,您可以尝试使用SqlTableDependency。 看看www.sqltabledependency.it

答案 5 :(得分:0)

它使用Service Broker。因此,它不适用于非托管SQL Azure实例。因此,如果您使用SQL Azure或曾经使用过,请保持谨慎。

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-features

  

服务经纪人

     

受单个数据库和弹性池支持:

     

     

受托管实例支持:

     

是的,但仅在实例内。   参见Service Broker differences

因此,除非您的所有环境都可以使用它,否则可能不太合适!