是否有可能找出谁在sql server 2005中调用了存储过程

时间:2013-04-22 12:05:23

标签: sql sql-server sql-server-2005

是否有可能找出谁调用了商店程序? ,我正在使用以下查询来识别执行计数等,但我无法确定哪个作业/触发器/进程正在调用它。请关于它的任何想法

SELECT  a.execution_count ,OBJECT_NAME(objectid) Name,
(CASE WHEN a.statement_end_offset = -1 
THEN
 len(convert(nvarchar(max), b.text)) * 2
ELSE
 a.statement_end_offset
END - a.statement_start_offset)/2 ) ,b.dbid ,dbname = db_name(b.dbid) , b.objectid
 ,a.creation_time,a.last_execution_time,a.* 
FROM  sys.dm_exec_query_stats a CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) as b
WHERE OBJECT_NAME(objectid) = 'Rebuild_Indexes' ORDER BY a.last_execution_time
ESCquery_text = SUBSTRING(b.text,a.statement_start_offset/2,

4 个答案:

答案 0 :(得分:3)

如果您想查看谁正在执行存储过程,那么解决此问题的一种方法是创建服务器端Trace并捕获SP:Completed事件。此事件类提供的数据将为您提供所需的所有来电者信息。

参考:BOL documentation on the SP:Completed Event Class

答案 1 :(得分:3)

使用Adam Machanic的Who is Active存储过程 - 返回有关活动语句的各种信息,包括启动它们的用户。

答案 2 :(得分:2)

好吧,如果你启动SQL分析器,它会显示NT用户的网络ID,我建议你在服务器上运行跟踪分析器,如果偶尔使用的话。或者,如果您没有使用简单恢复模式,那么答案将在事务日志备份中。然而,这不容易分析或阅读。

答案 3 :(得分:1)

使用Dynamic Management Views选项。 DMV提供了一个简单而熟悉的关系接口,用于从SQL Server收集关键系统信息。

SELECT DB_NAME(der.database_id) AS databaseName,
       OBJECT_NAME(objectid),
       der.session_id,
       login_name,
       USER_NAME(der.user_id) AS user_name,
       der.command,
       dest.text AS [CommandText],
       des.login_time,
       des.[host_name],
       dec.client_net_address,
       des.[program_name],       
       der.status
FROM sys.dm_exec_requests der
  INNER JOIN sys.dm_exec_connections dec ON der.session_id = dec.session_id
  INNER JOIN sys.dm_exec_sessions des ON der.session_id = des.session_id
  CROSS APPLY sys.dm_exec_sql_text (sql_handle) AS dest
WHERE des.is_user_process = 1 
  --AND OBJECT_NAME(objectid) = 'Rebuild_Indexes'