Answers:
默认情况下,SQL Server活动未按照您期望的方式记录。事务日志中记录了一些写活动,但这也取决于数据库的设置方式。
跟踪服务器上的SELECT活动有四个主要选项:
您可以使用SQL Server Profiler连接到服务器,并监视发生的特定活动。
您可以创建服务器端跟踪以将活动记录到服务器上的跟踪文件中,然后可以通过SQL Server Profiler读取该文件,也可以使用fn_trace_gettable将其加载到表中以进行进一步分析。
您可以使用扩展事件,它提供的功能比服务器端跟踪更多,Microsoft推荐使用扩展事件,而不是从SQL Server 2012开始的服务器端跟踪。
您可以使用C2审核模式。
您可以使用SQL Server Profiler来设置跟踪(选择所需的特定事件,过滤器等),然后使用“文件”菜单将其脚本化并在服务器上执行以创建服务器端跟踪,如下所述在这里。
有几种SQL Server解决方案和技术可用于跟踪SELECT语句
专门开发的存储过程和功能–注意:此方法需要具备T-SQL编程的高级知识以及对存储过程和功能的额外维护(例如,在数据库模式更改的情况下)。您可以在本文中看到更多信息:http : //alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html
SQL Server跟踪技术-您可以阅读本文中的分步说明:http : //solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/
使用SQL Server审核功能-审核功能(在SQL Server 2008中引入)可以跟踪服务器和数据库事件,并且正在使用扩展事件技术。但是,仅SQL Server Developer和Enterprise版本支持数据库级别的审核。
使用第三方工具,例如ApexSQL Audit或Idera SQL Compliance Manager
只要您不关心谁运行查询,就可以通过某些方式查看有关系统中正在运行的查询的指标。这仅限于自上次重新启动以来的数据,并可能受计划缓存(或其他内存)压力的影响,具体取决于您扩展查询的深度。
;WITH x AS
(
SELECT
[text] = SUBSTRING(t.[text],
(s.statement_start_offset/2)+1,
COALESCE(NULLIF(s.statement_end_offset,-1),DATALENGTH(t.[text])*2)
-(s.statement_start_offset/2)),
s.execution_count, s.last_execution_time,
s.max_logical_reads, s.max_elapsed_time
FROM sys.dm_exec_query_stats AS s
CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
)
SELECT * FROM x
WHERE LTRIM([text]) LIKE 'SELECT%';
您可能需要扩展模式-例如,这将忽略以开头的查询,具有;WITH
讽刺意味的是,它可以捕获SELECT INTO
甚至引用不引用实际表的变量分配。
但是,如果您需要的不是这些,则Nathan的答案是一个好的开始(除非您要使用trace,否则请不要使用Profiler)。请记住,针对您的系统记录每个查询并不是免费的。