2016-02-05 66 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)) 
相关问题