有没有办法使用Profiler来确定查询是否正在访问表?
我看到一个名为Object:Opened
的事件(指示何时访问了某个对象,例如SELECT,INSERT或DELETE语句)和Object:Closed
,但这些似乎不起作用。
特别是,我使用Object:Opened和Object创建了一个简单的跟踪:没有过滤器关闭(标准的“应用程序名称不像'SQL Profiler'”过滤器除外)并运行SELECT TOP 1 * FROM TableName
,但没有事件报道了。
那么,有没有办法使用Profiler来确定是否正在从中选择一个表?
答案 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“审计模式对象访问事件”。
虽然经过一些挖掘后我发现了这一点,但我找到了这篇优秀文章;
此致
达伦。
答案 3 :(得分:0)
我没有在SQL Server 2005中看到它们。
根据我的经验,我会查看SQL:StmtStarting
AND SP:StmtStarting
- 您可以在TextData
上过滤%TABLE_NAME%
。当您使用SP:StmtStarting
时,这甚至可以捕获SP内部的内容。
它不是防弹的,因为它必须使用LIKE
语法,但它可能会让你得到你想要的东西。