1

CLRトリガーをテーブルに割り当てて、キャッシュサーバーをリアルタイムで更新するためのプロトタイプソリューションを実装しました。これにより、特定の列が更新されるたびに、トリガーから呼び出されたURLがキャッシュサーバーを正しいデータで更新します。

正常に動作しており、コードは次のとおりです。

[Microsoft.SqlServer.Server.SqlTrigger(Name = "AdStatusChanged", Target = "Ads", Event = "FOR UPDATE")]
public static void AdStatusChanged()
{
    SqlTriggerContext triggContext = SqlContext.TriggerContext;
    int adID = 0, adStatusID_Old = 0, adStatusID_New = 0;

if (triggContext.TriggerAction == TriggerAction.Update)
{
    using (SqlConnection conn = new SqlConnection("context connection=true"))
    {
        conn.Open();
        SqlCommand sqlComm = new SqlCommand();
        SqlPipe sqlP = SqlContext.Pipe;

        sqlComm.Connection = conn;
        sqlComm.CommandText = "SELECT AdID, AdStatusID from INSERTED";

        SqlDataReader reader = sqlComm.ExecuteReader();

        if (reader.Read())
        {
            adID = reader.GetInt32(0);
            adStatusID_New = reader.GetInt32(1);
        }

        reader.Close();

        sqlComm.CommandText = "SELECT AdID, AdStatusID from DELETED WHERE AdID = " + adID;

        reader = sqlComm.ExecuteReader();

        if (reader.Read())
        {
            adID = reader.GetInt32(0);
            adStatusID_Old = reader.GetInt32(1);
        }
    }

    if (adID == 0 || adStatusID_New == adStatusID_Old)
    {
        // Check could be more thorough !
        return;
    }

    WebResponse httpResponse = null;

    try
    {
        string apiURL = string.Format("{0}/{1}", "http://localhost:14003/Home", "UpdateAdStatus?adID=" + adID + "&adStatusID=" + adStatusID_New);

        var httpWebRequest = (HttpWebRequest)WebRequest.Create(apiURL);
        httpWebRequest.Method = "GET";

        httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

        // check for successful response
    }
    catch (Exception ex)
    {
        Log("WebRequest from within SQL Server failed ! " + ex.Message);
    }
    finally
    {
        if (httpResponse != null)
        {
            httpResponse.Close();
        }
    }
}

}

パフォーマンス、デッドロック、SQLクラッシュ、またはその他の潜在的な懸念事項に関するこのアプローチの「短所」について、専門家/経験豊富な意見をお聞かせください。

誰かがこれを試したことがありますか(多くの人が持っている必要があると確信しています)、その結果はどうでしたか?実装が成功したか、他の方法に戻ったか、キャッシュをリアルタイムで更新しましたか?

4

0 に答える 0