首页 > 运维 > linux运维 > 正文

SQL Server检索SQL和用户信息的需求

絕刀狂花
发布: 2025-07-13 08:44:51
原创
173人浏览过

在sql server中,获取历史sql执行者的需求确实是一个挑战,因为sql server的动态管理视图(dmv)主要用于实时监控和获取当前活动的信息,而不是历史数据。让我们来探讨一下这个问题,并提供一些可能的解决方案。

首先,让我们回顾一下你提供的信息:

  1. Oracle的实现:在Oracle中,可以通过v$sql视图的parsing_schema_name字段获取执行SQL的用户信息。

  2. SQL Server的现状

    • 你找到了sys.dm_exec_cached_planssys.dm_exec_sql_text来获取当前缓存的SQL语句,但这些视图不包含用户信息。
    • 你也尝试了sys.dm_exec_sessions来获取登录用户信息,但无法直接关联到具体的SQL语句。
    • 最后,你找到了一条查询,可以获取当前正在执行的SQL和会话信息,但这仅限于当前执行的SQL,不包括历史数据。
  3. 大师的建议:SQL Server不能通过DMV视图直接查询历史SQL,只能通过不断采集当前会话的SQL并保存下来。

基于这些信息,我们可以考虑以下解决方案:

1. 使用SQL Server Profiler或Extended Events

SQL Server Profiler和Extended Events可以用来捕获SQL语句的执行信息,包括用户信息。这些工具可以设置为持续运行,并将数据保存到文件或表中。

示例使用Extended Events:

CREATE EVENT SESSION [CaptureSQLExecutions] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_hostname, sqlserver.username)
    WHERE ([sqlserver].[database_name]=N'XXX')
)
ADD TARGET package0.event_file(SET filename=N'C:\SQLServer\CaptureSQLExecutions.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
<p>ALTER EVENT SESSION [CaptureSQLExecutions] ON SERVER STATE = START
GO
登录后复制

你可以使用以下查询来读取捕获的数据:

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

微信 WeLM33
查看详情 微信 WeLM
SELECT 
CAST(event_data AS XML).value('(/event/action[@name="username"]/text())[1]', 'nvarchar(128)') AS [Username],
CAST(event_data AS XML).value('(/event/data[@name="batch_text"]/value)[1]', 'nvarchar(max)') AS [SQLText]
FROM sys.fn_xe_file_target_read_file('C:\SQLServer\CaptureSQLExecutions*.xel', NULL, NULL, NULL)
登录后复制

2. 使用SQL Server Audit

SQL Server Audit可以用来记录数据库活动,包括SQL语句和执行用户。

示例设置Audit:

USE [master]
GO</p><p>CREATE SERVER AUDIT [SQLExecutionsAudit]
TO FILE 
(   FILEPATH = N'C:\SQLServer\Audit\'
,MAXSIZE = 0 MB
,MAX_ROLLOVER_FILES = 2147483647
,RESERVE_DISK_SPACE = OFF
)
WITH
(   QUEUE_DELAY = 1000
,ON_FAILURE = CONTINUE
)
GO</p><p>ALTER SERVER AUDIT [SQLExecutionsAudit] WITH (STATE = ON)
GO</p><p>USE [XXX]
GO</p><p>CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpec]
FOR SERVER AUDIT [SQLExecutionsAudit]
ADD (SELECT ON DATABASE::XXX BY [public])
WITH (STATE = ON)
GO
登录后复制

你可以查询审计日志来获取SQL语句和用户信息:

SELECT <em> FROM fn_get_audit<em>file('C:\SQLServer\Audit\SQLExecutionsAudit</em></em>.sqlaudit', NULL, NULL)
登录后复制

3. 第三方工具

有许多第三方工具(如ApexSQL、Redgate SQL Monitor等)可以提供更高级的监控和历史数据记录功能。这些工具通常可以捕获SQL语句、执行用户和其他相关信息,并提供详细的报告和分析功能。

结论

SQL Server的设计确实没有直接提供一个类似Oracle的v$sql视图来获取历史SQL执行者的信息。微软的设计可能基于性能和安全考虑,限制了历史数据的直接查询。然而,通过使用Extended Events、SQL Server Audit或第三方工具,你可以实现类似的功能。

希望这些建议能帮助你解决在SQL Server中获取历史SQL执行者的需求。如果你有进一步的问题或需要更详细的指导,请随时告诉我。

SQL Server检索SQL和用户信息的需求

以上就是SQL Server检索SQL和用户信息的需求的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号