我在这里想念什么?我在 SQL Server Profiler 中看到的查询都是针对主数据库的,这使得按数据库名称过滤变得很困难……我应该监视哪些事件或事件,以便我可以按数据库名称过滤。
更大的问题是,这里到底发生了什么?
我在这里想念什么?我在 SQL Server Profiler 中看到的查询都是针对主数据库的,这使得按数据库名称过滤变得很困难……我应该监视哪些事件或事件,以便我可以按数据库名称过滤。
更大的问题是,这里到底发生了什么?
您应该从 EntityFramework 连接中删除此“MultipleActiveResultSets=True”
细绳
之后,您可以在 Profiler 中看到目标数据库名称,而不是 master。
在我的选择中,也许 ADO.NET 团队想要使用 MultipleActiveResultSets 功能来获取
来自 DB 的数据,因此他们必须访问 master。
MultipleActiveResultSets 是关于引发一个查询而不返回其所有结果(如在 LINQ 中的 foreach 语句中),同时引发另一个查询以在同一会话中获取另一个数据。
默认情况下,DB 不允许这种行为。所以.....
我能够解决这个问题,包括通过在我的连接字符串中添加应用程序名称来保持 MARS 处于活动状态:
Data Source=database_server;Initial Catalog=MyDatabase;Trusted Connection=true;MultipleActiveResultSets=True;Application Name=MyDatabase;
然后您可以过滤应用程序名称。
如果这是针对 SQL Server 2008 R2,请在跟踪属性中的“事件选择”选项卡上,选中“显示所有列”。然后,您应该能够创建基于 DatabaseName 的列过滤器。
我相信您必须暂停或停止跟踪才能进行这些更改。
正如 K Ivanov 指出的那样,启用 MARS(MultipleActiveResultSets)将在 SQL Profiler 中将 DatabaseName 显示为 master。通过将此设置为 false,它将显示正确的 DatabaseName,但随后您将失去拥有 MultipleActiveResults 的能力。
您可以使用LoginName
或HostName
在分析器中进行过滤
出于某种原因,如果我选择 SP:CacheHit 事件,它现在会显示针对正确数据库的查询,并且我可以通过它进行过滤。那个事件到底是什么?