首先啓用BROKER
SELECT is_broker_enabled FROM sys.databases WHERE name = 'ATSHOW'
use ATSHOW
go
ALTER DATABASE ATSHOW SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE ATSHOW SET ENABLE_BROKER;
SELECT is_broker_enabled FROM sys.databases WHERE name = 'ATSHOW'
參考程序
private static string conn = ConfigurationManager.ConnectionStrings["連接字符串名稱"].ConnectionString;
static SqlDependency dependency;
protected void Page_Load(object sender, EventArgs e)
{
SqlDependency.Start(conn); //傳入連接字符串,啓動基於數據庫的監聽
if (!IsPostBack)
{
Update(conn);
}
}
//使用SqlDependency監控數據庫表變化
private void Update(string conn)
{
using (SqlConnection connection = new SqlConnection(conn))
{
StringBuilder strsql = new StringBuilder();
//對被監控的目標表做簡單查詢,此處 要注意 不能使用* 表名要加[dbo] 否則會出現一直調用執行 OnChange
strsql.Append(@"sql查詢語句,查詢目標表");
using (SqlCommand command = new SqlCommand(strsql.ToString(), connection))
{
connection.Open();
command.CommandType = CommandType.Text;
dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);//添加監控,檢測數據表變化
//必須要執行一下command
command.ExecuteNonQuery();
//Console.WriteLine(dependency.HasChanges);
//connection.Close();
}
}
}
//檢測到數據表變化後執行動作
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
//這裏要再次調用
Update(conn);
//刷新前臺頁面
Response.AddHeader("Refresh", "0");
}
}
如果無效,重要問題
一、檢查SQL查詢語句
查詢通知只支持某些 Transact-SQL 語句。
首先,要支持通知,查詢中不得包含下列內容:
-
派生的表。
-
行集函數。
-
UNION 運算符。
-
子查詢。
-
外聯接或自聯接。
-
TOP 子句。
-
DISTINCT 關鍵字。
-
COUNT(*) 聚合函數。
-
AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函數。
-
用戶定義的聚合函數。
-
引用可空表達式的 SUM 函數。
-
完全文本謂詞 CONTAINS 或 FREETEXT。
-
COMPUTE 或 COMPUTE BY 子句。
-
聚合表達式(如果在選擇列表中未指定 GROUP BY)。如果指定了 GROUP BY,選擇列表中必須包含 COUNT_BIG(*) 表達式,並且不能指定 HAVING、CUBE 或 ROLLUP。
-
INTO 子句。
-
將阻止結果更改的條件(例如 WHERE 1=0)。
-
FOR BROWSE(或在 SET NO_BROWSETABLE ON 的情況下運行)。
-
READPAST 鎖定提示。
其次,查詢不得引用下列內容:
-
臨時表或表變量。
-
其他數據庫或服務器中的表或視圖。
-
所有其他視圖或表值函數。
-
任何系統表或視圖。
-
任何非確定性函數,包括評級和窗口函數。
-
任何服務器全局變量
-
任何服務中介程序隊列。
-
同義詞。
最後,查詢必須引用基表或視圖。
二、必須調用 command.ExecuteNonQuery(); 參考上面代碼
三、有可能字符串連接中的登陸用戶的權限不足
首先檢查所有着是否正確
用圖形化的方法。
數據庫右擊->屬性->文件->選擇數據庫所有者->選擇[sa]-- ok。
四、其他問題,對於其他問題,使用 SQL 跟蹤對查詢通知進行故障排除
事件類
以下事件類報告有關查詢通知的信息:
-
QN:Dynamics
QN:Dynamics 事件報告有關數據庫引擎執行以支持查詢通知的後臺活動的信息。在數據庫引擎中,後臺線程監視訂閱超時、要激發的掛起訂閱和參數表析構。
-
QN:Parameter Table
QN:Parameter Table 事件報告有關創建、刪除存儲參數信息的內部表和爲其保留引用計數所需操作的信息。另外,此事件還報告重置參數表的使用計數的內部活動。
-
QN:Template
QN:Template 事件報告有關查詢模板的內部使用情況的信息。查詢模板是數據庫引擎用於針對通知共享查詢定義的機制。這些模板是與參數表一起創建的。當創建、使用或銷燬查詢模板時,數據庫引擎會創建此類型的事件。
-
QN:Subscription
QN:Subscription 事件報告有關通知訂閱的信息。例如,在註冊、刪除或破壞訂閱時,此事件報告有關支持查詢通知訂閱的 Service Broker 操作的信息。
使用方法:使用SQL SERVER Profiler監視消息,顯示所有事件,然後勾選Broker相關事件,即可查看相關消息;