2016-02-05 51 views
1

有沒有辦法在存儲過程中檢查它是由Job觸發還是使用其他方法,例如SSIS,在特別查詢等?如何檢查運行存儲過程是否由作業觸發?

有類似的問題SQL Server Find What Jobs Are Running a Procedure 但它只是檢查工作步驟,但這不是我所需要的。

這是我的場景。

我有SP spDoSomethingImportant,可以由Job或數據庫中的用戶運行。

因此,在該SP中,我想檢查它是否被作業觸發並獲取該作業的名稱或ID。

+0

你不能這麼做,因爲你問。但是,您可以確定哪個用戶是由哪個用戶建立的。假設你有一個專門的工作用戶,它應該是非常簡單的。 –

+0

謝謝你的評論。不幸的是,可能有很多用戶可以直接運行這個SP,或者它將按計劃運行(通過Sql Agent - 服務帳戶),所以我恐怕無法做到這一點。 –

+1

是的,我不這麼認爲。請記住,sql server不關心你的工作。他們真正做的就是製作一個很好的包,就像任何其他用戶一樣執行sql。因此,除非您將該信息放入連接字符串中,否則您無法確定所調用的步驟是什麼。 ApplicationName,UserName等來幫助識別什麼是你的程序。 –

回答

2

我創建了以下存儲過程:

CREATE PROCEDURE TESTME 
AS 

INSERT INTO TEST_LOG 
SELECT * 
FROM sys.dm_exec_sessions 
WHERE session_Id = @@SPID 

GO 

我再從SSMS中運行它。在TEST_LOG中,Program_name列是「Microsoft SQL Server Management Studio - 查詢」

然後我創建了一個作業來運行此SPROC。在TEST_LOG,列program_name是「的SQLAgent - TSQL JobStep(工作0xCB393E8FF0E9D44485204D0100803469:步驟1)」

所以,如果你不想傳遞參數來表示,如果它運行的工作,我想你可以看着辦吧從sys.dm_exec_sessions.Program_name

+0

這可能不是理想的解決方案,它可能不適用於所有應用程序,但它應該適用於作業名稱。謝謝。 –

0

從羅伯特保爾森的偉大建議,我已經創建了一個簡單的解決方案來實現這一點。

我也使用這個位置的一些代碼將字符串轉換爲唯一標識符。它由Scott Pletcher發佈。有一個函數可以從字符串中獲得這個uid。 http://www.sqlservercentral.com/Forums/FindPost1480606.aspx

示例代碼可以像這樣。如果未由SQL代理運行,代碼將無法工作,因此需要進行更多檢查。

--Get Program Name 
DECLARE @ProgramName VARCHAR(255) 
DECLARE @StartOfJjobId INT 
DECLARE @JobIdPrefix VARCHAR(30) = '(Job 0x' 
SET @ProgramName = (SELECT Program_name FROM sys.dm_exec_sessions WHERE session_Id = @@SPID) 
--If run by job it will returns something like this line below 
--SQLAgent - TSQL JobStep (Job 0x5A9C063C3BDE5D41B4CBF86D4C1A82A5 Step 1) 
SET @StartOfJjobId = CHARINDEX(@JobIdPrefix, @ProgramName) + LEN(@JobIdPrefix) 

select name AS JobName from msdb..sysjobs where job_id = (SELECT CAST(
     SUBSTRING(@ProgramName, @StartOfJjobId + 06, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 04, 2) + 
     SUBSTRING(@ProgramName, @StartOfJjobId + 02, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 00, 2) + '-' + 
     SUBSTRING(@ProgramName, @StartOfJjobId + 10, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 08, 2) + '-' + 
     SUBSTRING(@ProgramName, @StartOfJjobId + 14, 2) + SUBSTRING(@ProgramName, @StartOfJjobId + 12, 2) + '-' + 
     SUBSTRING(@ProgramName, @StartOfJjobId + 16, 4) + '-' + 
     SUBSTRING(@ProgramName, @StartOfJjobId + 20,12) AS uniqueidentifier)) 
相關問題