簡體   English   中英

是否可以找出誰在 SQL Server 2005 中調用了存儲過程

[英]Is it possible to find out who called a stored procedure in 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,

如果您想查看誰正在執行存儲過程,解決此問題的一種方法是創建服務器端 Trace 並捕獲SP:Completed事件。 此事件類提供的數據將為您提供您需要的所有調用者信息。

參考:關於SP:Completed Event Class 的 BOL 文檔

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

好吧,如果您啟動 SQL 探查器,它會向您顯示 NT 用戶的網絡 ID,如果偶爾使用,我建議您在服務器上運行跟蹤探查器。 或者,如果您不使用簡單恢復模式,那么答案將在事務日志備份中。 然而,這並不容易分析或閱讀。

使用動態管理視圖選項。 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM