SQL 查询通知 - 更新失败,因为以下 SET 选项设置不正确:'QUOTED_IDENTIFIER'

SQL Query Notifications - UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'

我的问题与 UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER' 有点相关。

我正在使用 SQL Query Notifications 从数据库中为我的应用程序启用缓存,并且 运行 出现了一种我无法完全解释的奇怪行为。

如果我运行一些SQL查询通知码

using (SqlCommand command=new SqlCommand("SELECT MyColumn1, MyColumn2, etc... FROM dbo.StockSupplierCode", connection))
{
    SqlDependency dependency=new SqlDependency(command);
    dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);
    command.ExecuteReader();    
}

运行第一次在我的数据库上进行此操作后,如果我尝试更新受影响的 table,我会收到错误消息:

Msg 1934, Level 16, State 1, Procedure Stock_NonIntTrigger, Line 14 [Batch Start Line 0] UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

该错误具体指的是它发生在我的数据库中名为 Stock_NonIntTrigger 的命名触发器中。

此错误现在将在我随后尝试更新此 table 的任何时候持续存在。

HOWEVER if I open this trigger, change nothing and resave it, the error disappears.

我唯一的假设是,当我重新保存此触发器时,SQL 查询分析器可能会添加 QUOTE_IDENTIFIER ON 语法,但是当我使用 sp_helptext 重新打开同一触发器时,它似乎不受影响和原来的一样。

但是现在更新将会成功。

任何能够提供任何见解的人:

  1. 为什么查询通知会导致此错误?
  2. 为什么重新保存触发器会使错误消失?

创建触发器时有效的 QUOTED_IDENTIFIERANSI_NULL 会话设置是 persisted as object meta-data。这些在 运行 时间使用并覆盖触发器范围内的当前会话设置。此行为也适用于存储过程、函数和视图。

创建对象时注意确保 QUOTED_IDENTIFIERANSI_NULL 都打开。这些选项在 SSMS 中默认启用,但出于向后兼容性原因,SQLCMD 不启用。我建议总是指定 -I SQLCMD 参数来打开带引号的标识符以避免这个问题。

关于查询通知,SQL 服务器需要正确设置 "magic 7" 会话选项才能使用此功能。这些是索引视图和过滤索引等其他功能所需的相同选项:

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON

现代 SQL 服务器 API 与 SQL Server 2005+ 数据库兼容性级别默认正确设置所有这些选项。但是,由于不注意细节,持久化设置是一个常见问题。