SqlDependency 監控數據庫 無效問題彙總

首先啓用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相關事件,即可查看相關消息;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章