You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何通过Eloquent执行的MSSQL查询未在事件会话中记录?

排查MSSQL事件会话无法捕获Laravel查询的问题

以下是可能的原因及对应解决思路:

1. 事件会话的事件配置不全或筛选过严

  • 检查QueryMonitor事件会话是否添加了sql_statement_completed、batch_completed这类核心查询事件。默认的QueryMonitor模板可能仅包含遥测类事件,并未开启实际SQL语句的捕获。
  • 检查会话的筛选条件:比如是否限定了特定数据库、登录名或应用程序名称。Laravel连接MSSQL时,默认应用程序名称可能不是你预期的值,导致查询被过滤。可以先移除所有筛选条件测试。

2. 事件会话的文件目标配置错误

  • 确认Docker Compose中是否正确挂载了MSSQL的日志目录(默认容器内路径为/var/opt/mssql/log)到宿主机。如果路径映射错误,你在宿主机查看的QueryMonitor.xel可能不是容器内实际写入的文件。
  • 检查事件会话的max_file_size和max_rollover_files设置:如果文件达到上限且未自动滚动,新的查询不会被记录。

3. Laravel端的查询未实际发送到数据库

  • 先在Tinker中验证查询是否真的执行:执行DB::enableQueryLog()后再运行你的查询,然后用DB::getQueryLog()查看Laravel生成的SQL。如果日志为空,说明查询被缓存或没有匹配数据。
  • 确认whereNull('parent_id')是否能匹配到数据:如果结果集为空,MSSQL不会产生查询执行记录。可以先打印$records确认是否有数据返回。

4. 权限或会话上下文不匹配

  • 检查创建事件会话的用户是否拥有ALTER ANY EVENT SESSION权限,权限不足会导致事件会话无法正常捕获事件。
  • 确认Laravel连接数据库的用户是否在事件会话的监控范围内:如果会话仅监控特定登录用户,而Laravel使用的是其他用户,查询不会被记录。

5. 容器内文件权限问题

  • 进入MSSQL容器(docker exec -it <你的容器名> bash),直接查看/var/opt/mssql/log下的QueryMonitor.xel文件,确认是否有查询记录。如果容器内文件有记录但宿主机看不到,说明挂载的目录权限配置错误。

内容的提问来源于stack exchange,提问作者Dimitrios Desyllas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:15:21