使用SQL Server Profiler访问日志表

时间:2008-11-17 21:01:36

标签: sql-server profiler

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

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

特别是,我使用Object:Opened和Object创建了一个简单的跟踪:没有过滤器关闭(标准的“应用程序名称不像'SQL Profiler'”过滤器除外)并运行SELECT TOP 1 * FROM TableName,但没有事件报道了。

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

使用Profiler有一种方法可以做到这一点,但它会对性能产生影响。

相反,您能否使用您正在使用的SQL Server版本澄清您的问题?如果您正在使用SQL Server 2008,请查看Audit对象,该对象旨在实现这一目标,而且它的性能影响非常小。

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

Implementing Security Audits in SQL Server 2008

其他海报已经注意到您可以在对象名称上过滤TextData,但如果有人使用视图来访问该对象,那么这不起作用。

答案 2 :(得分:3)

我找到了一种通过探查器的方法,即EventClass“审计模式对象访问事件”。

虽然经过一些挖掘后我发现了这一点,但我找到了这篇优秀文章;

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

此致

达伦。

答案 3 :(得分:0)

我没有在SQL Server 2005中看到它们。

根据我的经验,我会查看SQL:StmtStarting AND SP:StmtStarting - 您可以在TextData上过滤%TABLE_NAME%。当您使用SP:StmtStarting时,这甚至可以捕获SP内部的内容。

它不是防弹的,因为它必须使用LIKE语法,但它可能会让你得到你想要的东西。