5

有没有办法使用 Profiler 来确定查询是否正在访问表?

我看到一个名为Object:Opened(指示何时访问对象,例如对于 SELECT、INSERT 或 DELETE 语句)和的事件Object:Closed,但这些似乎不起作用。

特别是,我使用没有过滤器的 Object:Opened 和 Object:Closed 创建了一个简单的跟踪(除了标准的“Application Name not like 'SQL Profiler'”过滤器)并运行SELECT TOP 1 * FROM TableName,但没有报告任何事件。

那么,有没有办法使用 Profiler 来确定是否正在从中选择表?

4

4 回答 4

4

调查 SQL 正在获取的锁可能会有所帮助。Select 语句通常会获取共享锁 (LCKMS),因此您可以对此进行过滤。

在分析器中查找 Locks:Acquired 事件。ObjectID 将解析为您可以轻松查找的表OBJECT_NAME(objectid)。Mode 会告诉您正在获取的共享锁的类型是 3。有关更多信息,请查看此处

于 2008-11-23T14:26:49.087 回答
3

Profiler 有一种方法可以做到这一点,但它对性能有很大的影响。

相反,您能用您使用的 SQL Server 版本澄清您的问题吗?如果您使用的是 SQL Server 2008,请查看 Audit 对象,该对象旨在执行此操作,而且它对性能的影响非常低。

这是一篇解释如何设置审计的文章:

在 SQL Server 2008 中实施安全审核

其他发帖者指出,您可以根据对象名称过滤 TextData,但如果有人使用视图访问该对象,这将不起作用。

于 2008-11-29T00:58:10.700 回答
3

我通过分析器找到了一种方法,即 EventClass“审计架构对象访问事件”。

虽然经过一番挖掘,我独立地发现了这一点,但我发现了这篇优秀的文章;

http://www.databasejournal.com/features/mssql/article.php/3887996/Determining-Object-Access-Using-SQL-Server-Profiler.htm

问候,

达伦。

于 2011-03-07T12:53:24.367 回答
0

我在 SQL Server 2005 中没有看到这些。

以我的经验,我看SQL:StmtStarting AND SP:StmtStarting - 你可以过滤TextData. %TABLE_NAME%当您使用SP:StmtStarting.

它不是万无一失的,因为它必须使用LIKE语法,但它可能会为您提供所需的内容。

于 2008-11-17T23:15:31.067 回答