2013-04-22 66 views
5

是否有可能找出誰叫存儲過程? ,我使用下面的查詢來確定執行計數等,但我無法確定哪個作業/觸發器/進程正在調用它。關於它的任何想法請是否有可能找出誰在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, 
+0

什麼是_who_? '@@ SPID'和'ORIGINAL_LOGIN()'是可用的。你想通過鍵盤查看指紋,看看誰真的啓動了應用程序? 'select * from sys.dm_exec_connections as EC inner join sys.dm_exec_sessions as ES on ES.session_id = EC.session_id where EC.session_id = @@ SPID'? – HABO 2013-04-22 12:54:42

+0

你會在答案中看到一個常見的主題,那就是,如果沒有記錄所有內容,就不可能看到誰存儲過程;相反,你可以看到誰正在呼叫它。 – 2013-04-22 19:59:05

回答

3

使用Adam Machanic的Who is Active存儲過程 - 這將返回有關活動語句的各種信息,包括啓動它們的用戶。

+0

非常感謝您的鏈接。需要像這樣的東西。 – 2013-04-22 17:18:23

3

如果你想看到誰是執行一個存儲過程,去了解這一個方法是創建一個服務器端跟蹤並捕獲SP:Completed事件。該事件類提供的數據將爲您提供所有您需要的呼叫者信息。

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

2

那麼,如果你火了SQL事件探查器,它會告訴你的NT用戶的網絡ID,我建議你在服務器上運行跟蹤分析器自身,如果這是一個偶然的用法。或者如果您不使用簡單恢復模式,則答案將在事務日誌備份中進行。然而,這並不容易分析或閱讀。

+0

謝謝,我確定了一個dtsx包。 – user362283 2013-04-23 08:14:45

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' 
相關問題