能否查出谁在 sql server 2005 中调用了存储过程?

问题描述 投票:5回答:4

能否查出谁调用了存储过程?我正在使用下面的查询来确定执行次数等,但我无法确定是哪个jobtriggerprocess在调用它。有什么好办法吗?

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,
sql sql-server sql-server-2005
4个回答
3
投票

使用Adam Machanic的 谁是活跃分子 存储过程 - 这将返回关于活动语句的各种信息,包括启动它们的用户。


3
投票

如果你想知道谁在执行存储过程,一种方法是创建一个服务器端的Trace,并捕获以下信息 SP:Completed 事件。 该事件类提供的数据将为你提供所有你应该需要的调用者信息。

参考。BOL文档中关于 SP:Completed 活动类


2
投票

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


1
投票

使用选项与 动态管理视图. DMVs提供了一个简单而熟悉的关系界面,用于从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'
© www.soinside.com 2019 - 2024. All rights reserved.