SQL Server 2005 的查詢通知機制仰賴 Service Broker。請先確認資料庫是否已啟用:
SELECT DATABASEPROPERTYEX(N'YourDB', N'IsBrokerEnabled'); -- 1=已啟用, 0=未啟用
若未啟用,需執行(注意:需獨佔存取,建議維護時段執行):
ALTER DATABASE YourDB SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;
在 ASP.NET 專案的 Global.asax 中管理連線字串的啟動/停止:
void Application_Start() {
SqlDependency.Start(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
}
void Application_End() {
SqlDependency.Stop(ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);
}
適合「資料變更頻率低、可接受短暫髒讀」的情境。流程:建立命令 → 建立依賴 → 取得資料 → 存入 Cache。
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn)) {
var dep = new SqlCacheDependency(cmd);
var callback = new CacheItemRemovedCallback(OnCacheRemoved);
conn.Open();
var data = cmd.ExecuteReader(); // 此時已註冊通知
Cache.Insert(cacheKey, data, dep,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.Default, callback);
}
適合「需即時反應、主動清除快取或觸發業務流程」的情境。
using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand(sql, conn)) {
var dep = new SqlDependency(cmd);
dep.OnChange += OnDependencyChange; // 訂閱變更事件
conn.Open();
cmd.ExecuteReader(); // 啟動偵聽
}
void OnDependencyChange(object sender, SqlNotificationEventArgs e) {
if (e.Type == SqlNotificationType.Change) {
Cache.Remove(cacheKey); // 或重新載入、發送訊號等
// 重要:事件觸發後需重新註冊新的 SqlDependency
ReRegisterDependency();
}
}
SELECT *),不可使用 UNION、DISTINCT、TOP、外部連接等。SUBSCRIBE QUERY NOTIFICATIONS 權限,且資料庫啟用 TRUSTWORTHY 或簽署憑證。Broker:Conversation、QN:Subscription 事件確認訊息流向。Application_End 正確呼叫 SqlDependency.Stop,避免殘留佇列造成重複啟動。SqlDependency 是 SQL Server 2005 強大的主動通知機制,善用可大幅降低輪詢資料庫的負擔。關鍵在於:正確啟用 Broker、嚴格遵守查詢限制、妥善處理事件生命週期,並建立完善的監控與重試機制。