2008-11-17 55 views
4

有没有办法使用Profiler来确定表是否被查询访问?使用SQL Server Profiler访问日志表

我看到一个名为Object:Opened的事件(表示当一个对象被访问,如SELECT,INSERT或DELETE语句)和Object:Closed,但这些似乎并没有工作。

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

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

回答

4

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

在剖析器中查找Locks:Acquired事件。 ObjectID将解析为表格,您可以使用OBJECT_NAME(objectid)轻松查找该表格。该模式会告诉你正在获取的锁共享锁的种类3.欲了解更多信息,请看here

0

我没有看到那些在SQL Server 2005

以我的经验,我看SQL:StmtStartingSP:StmtStarting - 你可以在%TABLE_NAME%过滤TextData。当你使用SP:StmtStarting时,这甚至会吸引SP内部的东西。

这不是防弹的,因为它必须使用LIKE语法,但它可能会帮助您找到所需的东西。

3

有一种方法可以用Profiler来实现,但它对性能有很大的影响。

相反,你可以用你正在使用的SQL Server版本来澄清你的问题吗?如果您使用的是SQL Server 2008,请查看审计对象,该对象专门用于执行此操作,而且它的性能影响非常低。

下面是一篇文章,解释了如何建立审计:

Implementing Security Audits in SQL Server 2008

其他海报指出的是,你可以在对象名称过滤的TextData,但如果有人使用视图访问不工作物体。

+0

我使用的是2000,但我希望问题在多个版本的SQL Server中是通用的。 – Tadmas 2009-01-02 23:02:18