如何在SQL Server跟踪中跟踪调用代码?

Mic*_*art 12 .net sql-server ado.net

我想使用SQL Server跟踪来跟踪有关使用数据库的代码的更多上下文.我打算在连接字符串上使用"Application Name"属性.看起来像下面这样:

object CallingObject; //set elsewhere
SqlConnectionStringBuilder connectionString = GetConnectionString();
connectionString.ApplicationName = CallingObject.GetType().ToString();
using (SqlConnection connection = new SqlConnection(connectionString.ToString()))
{
    // do your thing
}
Run Code Online (Sandbox Code Playgroud)

除了大量的结果连接字符串意味着.net的连接池不再有效.

如何在不损失连接池优势的情况下跟踪SQL跟踪中的调用代码?

Tao*_*Tao 3

只要您使用 SQL Server,并且只要您拥有(或可以拥有)集中式连接创建逻辑,您就可以使用该CONTEXT_INFO功能:http ://msdn.microsoft.com/en-us/library/ms187768 .aspx

我们执行类似的操作来跟踪多用户服务器端应用程序中的数据库连接。每次创建新的数据库连接(实际上是从连接池中重用,但在 ADODB/ADO.Net 代码中“创建”):

DECLARE @ContextInfoBinary binary(128); 
SET @ContextInfoBinary = Convert(Binary(128), 'XX' + Replicate(Char(0), 36) + 'Up to 90 characters of connection info - username, page, action, etc') 
SET CONTEXT_INFO @ContextInfoBinary
Run Code Online (Sandbox Code Playgroud)

稍后,当您想要“跟踪”连接时,可以将 context-info 的指定范围转换回 VarChar 内容:

SELECT RTRIM(hostname) AS hostname
    , hostprocess
    , RTRIM(program_name) AS program_name
    , CASE 
        WHEN SubString(Context_Info, 1, 2) = 0x5858
            THEN Replace(Convert(VarChar(90), SubString(Context_Info, 39, 90)), CHAR(0), '')
        ELSE 'UNKNOWN' 
        END AS ExtendedConnectionDescription
    --More stuff here, depending on what you're looking for
FROM master.sys.sysprocesses 
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 我们之所以转向这个概念,是因为应用程序名称功能的连接池问题。对于我们来说,能够在任何给定时间点跟踪特定用户和进程的阻塞原因非常重要。
  • 这会添加一个要为创建的每个连接执行的数据库命令 - 这可能会也可能不会带来很大的开销,具体取决于您的应用程序设计
  • 此示例使用 VarChar(最多 90 个字符);如果您需要跟踪 NVarChar(扩展字符)数据,您的空间将减少到 45 个字符
  • 在此示例中,我们留下 36 个字节可用于其他目的,例如防止对某些连接执行触发器。
  • 您可以使用 显式地将值输出到跟踪sp_trace_generateevent,如以下相关问题中所述:How do you access the Context_Info() variable in SQL2005 Profiler?

更新:

只有在重新阅读您的问题后,我才意识到您似乎明确希望仅向跟踪添加信息,而不是对当前连接进行临时分析(这更多的是我与“应用程序名称”的使用相关联)与,抱歉);我见过的唯一有用的方法是调用sp_trace_generateevent。如果您打算这样做,我建议您添加connection_info,因为它不会再花费您更多的费用(您已经有了 的 db 往返sp_trace_generateevent)并且肯定会帮助您进行其他类型的分析稍后的。