簡體   English   中英

SQL 查詢通知 - 更新失敗,因為以下 SET 選項的設置不正確:'QUOTED_IDENTIFIER'

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

我的問題與UPDATE failed 有點相關,因為以下 SET 選項的設置不正確: 'QUOTED_IDENTIFIER'

我正在使用SQL 查詢通知來為我的應用程序從數據庫啟用緩存,並且遇到了我無法完全解釋的奇怪行為。

如果我運行一些 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();    
}

第一次在我的數據庫上運行此操作后,如果我嘗試更新受影響的表,則會收到錯誤消息:

消息 1934,級別 16,State 1,過程 Stock_NonIntTrigger,第 14 行 [Batch Start Line 0] 更新失敗,因為以下 SET 選項的設置不正確:'QUOTED_IDENTIFIER'。 驗證 SET 選項對於索引視圖和/或計算列上的索引和/或過濾索引和/或查詢通知和/或 XML 數據類型方法和/或空間索引操作是否正確。

該錯誤專門指它發生在我的數據庫中名為Stock_NonIntTrigger的命名觸發器中。

現在,只要我隨后嘗試更新此表,此錯誤就會持續存在。

但是,如果我打開此觸發器,不進行任何更改並重新保存,錯誤就會消失。

我唯一的假設是,當我重新保存此觸發器時,SQL 查詢分析器可能正在添加 QUOTE_IDENTIFIER ON 語法,但是當我使用sp_helptext重新打開同一個觸發器時,它似乎不受影響並且與原始觸發器相同。

然而,更新現在將成功。

任何能夠提供任何見解的人:

  1. 為什么查詢通知會導致此錯誤?
  2. 為什么重新保存觸發器會使錯誤 go 消失?

在創建觸發器時有效的QUOTED_IDENTIFIERANSI_NULL session 設置作為 object 元數據保留 這些在運行時使用並覆蓋觸發器 scope 中的當前 session 設置。 此行為也適用於存儲過程、函數和視圖。

創建對象時請注意確保QUOTED_IDENTIFIERANSI_NULL都為 ON。 這些選項在 SSMS 中默認啟用,但出於向后兼容性的原因,在 SQLCMD 中不啟用。 我建議總是指定-I SQLCMD 參數來打開帶引號的標識符以避免這個問題。

關於查詢通知,SQL 服務器需要正確設置“魔術 7”session 選項才能使用此功能。 這些與索引視圖和過濾索引等其他功能所需的選項相同:

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 服務器 2005+ 數據庫兼容性級別正確設置。 但是,由於不注意細節,持久設置是一個常見問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM