Sql-Server-2008-R2
需要腳本來查找在 SQL 中呼叫的 SP
我無法跟踪每天早上 7 點執行的儲存過程。是否有任何腳本可以檢查哪個作業呼叫了該特定 SP?
SQL Server 代理作業定義儲存在
msdb
數據庫中的sysjobs
和sysjobsteps
表中。您可以使用以下查詢對這些表進行純文字搜尋:SELECT * FROM msdb.dbo.sysjobsteps WHERE subsystem='TSQL' AND command LIKE '%nameofmyprocedure%'
請注意,在某些情況下您的儲存過程仍然不會顯示。
- 如果作業執行另一個儲存過程,該作業又會啟動您要查找的儲存過程
- 如果 SSIS 包啟動儲存過程
- 如果該過程不是由 SQL Server 代理啟動,而是由其他一些調度程序任務啟動
創建一個新表,如下所示:
create table CaptureUnwantedJob ( SQL_Command nvarchar(max), SPID int, Status nvarchar(125), Command nvarchar(255), ProgramName nvarchar(500) ) go
創建一個將在早上 6:59 開始的新代理作業。將此查詢放入其中:
truncate table CaptureUnwantedJob declare @i int = 1 while @i <= 10 begin insert into CaptureUnwantedJob SELECT sqltext.TEXT, req.session_id, req.status, req.command, pr.program_name FROM sys.dm_exec_requests req join sys.sysprocesses pr on pr.spid = req.session_id CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext set @i+=1 -- wait another 10s before capturing again waitfor delay '00:00:10' end -- analyze the captured spids based on the PrgramName column -> it should look like something like this: -- SQLAgent - TSQL JobStep (Job 0xF4CBD0F6534D9D49B28E15E15138ABD7 : Step x) select * from CaptureUnwantedJob where ProgramName like '%SQLAgent%'
順便說一句,您將需要高度提升的權限-我相信是系統管理員角色的一部分-以便能夠查詢上述 3 個表。
下一步 - 我不知道有什麼腳本可以做到這一點,但在這裡你必須做一些手動工作 - 一旦你執行執行該 sp 的作業,它將採用以下格式:0xF4CBD0F6534D9D49B28E15E15138ABD7 - 獲取最後的 32 chars 並相應地放置“-”,以便您獲得有效的唯一標識符 -> 結果將是您正在尋找的 job_id:
select * from msdb.dbo.sysjobs where job_id = convert(uniqueidentifier,'F6D0CBF4-4D53-499D-B28E-15E15138ABD7')
祝你好運!