有没有办法在存储过程中检查它是由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等来帮助识别什么是你的程序。 –