Sql server 2008 r2 从CLR触发器中提交WebRequest

Sql server 2008 r2 从CLR触发器中提交WebRequest,sql-server-2008-r2,real-time,sqlclr,data-caching,Sql Server 2008 R2,Real Time,Sqlclr,Data Caching,我刚刚实现了一个原型解决方案,通过向表分配一个CLR触发器来实时更新缓存服务器,这样每当某个列被更新时,从触发器调用的URL就会用正确的数据更新缓存服务器 工作正常,代码如下: [Microsoft.SqlServer.Server.SqlTrigger(Name = "AdStatusChanged", Target = "Ads", Event = "FOR UPDATE")] public static void AdStatusChanged() { SqlTriggerCont

我刚刚实现了一个原型解决方案,通过向表分配一个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崩溃或其他可能引起关注的方面的“缺点”提出一些专家/经验丰富的看法


有没有人试过这个(我肯定很多人都试过),结果如何?成功的实现或您是否恢复到其他方法或实时更新缓存?

通常,人们对此使用不太复杂的机制,例如或只是公开每行的修改日期,并让服务轮询以查看是否有新更新的行。乍一看,您在CLR触发器内进行的数据访问(用于确定新旧值是否不同)似乎效率低下。Thx@AaronBertrand。如果您能详细说明一下如何提高数据访问的效率,我将不胜感激,如果我计划采用这一方法的话。我也阅读了查询通知,但它说我只能订阅某个“查询”,并且在其结果集更改时会收到通知。这意味着,如果我的数据库中有一百万个活动广告,我的缓存服务器必须有一百万个db服务器订阅,以便在“adstatus”更改时得到通知!!这听起来很疯狂:(我不认为一百万订阅是我所建议的。我面临的一般问题是,触发并点击一个URL来更改多达一百万个广告也不理想。缓存服务器真的需要立即了解每一个广告更改吗?或者每五个或n个广告更改的总数可以通知它吗分钟?明白你的意思:)Thx。我的印象是,每更改一行都会单独调用触发器。我可以更改实现以对缓存服务器进行批更新。注释?