扩展事件连接\u id与客户端\u连接\u id

4dc9hkyq  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(309)

大家好,我想找到一种方法来识别在microsoftsqlserver中为扩展事件执行的查询(只使用已执行的查询过滤扩展事件)
如果我像这样查询sql server中的系统视图:

SELECT  session_id, connection_id
FROM sys.dm_exec_requests
WHERE session_id = @@SPID

我得到当前正在执行的查询的连接id,该id在sql server重新启动之前是唯一的。
但是扩展事件有一个名为“sqlserver.client\u connection\u id”的不同值,该值与表“sys.dm\u exec\u requests”中的“connection\u id”的标识符不同。
您知道在系统表中哪里可以找到“sqlserver.client\u connection\u id”吗?或者另一种解决方案来不确定地标识已执行的查询?

k7fdbhmy

k7fdbhmy1#

这个 client_connection_id 在扩展事件中(根据ssms)
提供客户端在连接时提供的可选标识符
是sqlconnection.clientconnectionid,用于支持对客户端连接问题进行故障排除。
如果启用了用于记录连接id的扩展事件,则可以在扩展事件日志中找到连接id,以查看故障是否在服务器上。对于某些连接错误,还可以在连接环缓冲区(sql server 2008中的连接疑难解答)中找到连接id。如果连接id不在连接环缓冲区中,则可以假定存在网络错误。
所以这个id将连接尝试的客户端和服务器端关联起来。对于成功的连接,将使用不同的id创建sys.dm\u exec\u connections和sys.dm\u exec\u sessions中的一行。
我正在尝试创建一个扩展事件,并报告所有查询的错误。然后使用一个标识符过滤.xel文件中的结果,该标识符告诉我这是来自x查询。
您可以在错误报告事件中捕获查询,例如:

CREATE EVENT SESSION [errors] ON SERVER 
ADD EVENT sqlserver.error_reported(
    ACTION
    (
       sqlserver.client_app_name,
       sqlserver.session_id,
       sqlserver.sql_text
    )
WHERE ([severity]>=(11)))
snvhrwxg

snvhrwxg2#

默认情况下,extended evets跟踪示例上的所有连接和活动。定义中的过滤器将限制这一点。
sqlserver.client\u connection\u id包含来自所有查询的所有值—因此,如果您确实知道客户端连接id,则可以标识这些结果。
我不清楚你想用扩展事件筛选什么?您希望查看从何处执行特定查询,还是跟踪特定连接上的所有查询?
您还可以在其他地方获得相同的连接信息:

SELECT * FROM sys.dm_exec_connections
SELECT * FROM sys.dm_exec_sessions
SELECT * FROM sys.dm_exec_requests

看看这些可能会帮助你建立联系。

相关问题