有沒有辦法在存儲過程中檢查它是由Job觸發還是使用其他方法,例如SSIS,在特別查詢等?如何檢查運行存儲過程是否由作業觸發?
有類似的問題SQL Server Find What Jobs Are Running a Procedure 但它只是檢查工作步驟,但這不是我所需要的。
這是我的場景。
我有SP spDoSomethingImportant,可以由Job或數據庫中的用戶運行。
因此,在該SP中,我想檢查它是否被作業觸發並獲取該作業的名稱或ID。
有沒有辦法在存儲過程中檢查它是由Job觸發還是使用其他方法,例如SSIS,在特別查詢等?如何檢查運行存儲過程是否由作業觸發?
有類似的問題SQL Server Find What Jobs Are Running a Procedure 但它只是檢查工作步驟,但這不是我所需要的。
這是我的場景。
我有SP spDoSomethingImportant,可以由Job或數據庫中的用戶運行。
因此,在該SP中,我想檢查它是否被作業觸發並獲取該作業的名稱或ID。
我創建了以下存儲過程:
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
這可能不是理想的解決方案,它可能不適用於所有應用程序,但它應該適用於作業名稱。謝謝。 –
從羅伯特保爾森的偉大建議,我已經創建了一個簡單的解決方案來實現這一點。
我也使用這個位置的一些代碼將字符串轉換爲唯一標識符。它由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))
你不能這麼做,因爲你問。但是,您可以確定哪個用戶是由哪個用戶建立的。假設你有一個專門的工作用戶,它應該是非常簡單的。 –
謝謝你的評論。不幸的是,可能有很多用戶可以直接運行這個SP,或者它將按計劃運行(通過Sql Agent - 服務帳戶),所以我恐怕無法做到這一點。 –
是的,我不這麼認爲。請記住,sql server不關心你的工作。他們真正做的就是製作一個很好的包,就像任何其他用戶一樣執行sql。因此,除非您將該信息放入連接字符串中,否則您無法確定所調用的步驟是什麼。 ApplicationName,UserName等來幫助識別什麼是你的程序。 –