【问题标题】:How to check if running store procedure was triggered by job?如何检查正在运行的存储过程是否由作业触发?
【发布时间】:2016-02-05 13:48:37
【问题描述】:

有没有办法在存储过程中检查它是由 Job 触发还是使用其他方法(例如 SSIS、at hoc query 等)触发的?

有类似的问题SQL Server Find What Jobs Are Running a Procedure 但它只是检查工作步骤,但这不是我需要的。

这是我的场景。

我有 SP spDoSomethingImportant,这可以由 Job 或即数据库中的用户运行。

因此,在该 SP 中,我想检查它是否由作业触发并获取该作业的名称或 ID。

【问题讨论】:

  • 你不能按照你的要求去做。但是您可以确定连接是从哪个用户建立的。假设您有一个专门的工作用户,这应该很简单。
  • 感谢您的评论。不幸的是,可能有很多用户可以直接运行这个 SP,或者它会按计划运行(通过 Sql Agent - 服务帐户),所以我恐怕做不到。
  • 是的,我不这么认为。请记住,sql server 并不关心您的工作。他们真正做的只是制作一个像其他用户一样执行 sql 的好包。因此,除非您将该信息放在连接字符串中,否则您无法判断哪个作业调用了某个步骤。 ApplicationName、UserName 等,以帮助识别调用您的程序的内容。
  • 是的,我是这么认为的。我想我将不得不添加类似参数的东西,我可以在其中传递作业 ID 或名称或其他有助于我跟踪触发给定存储过程的内容。谢谢
  • 我想知道您是否可以使用CONTEXT_INFO 来帮助确定它是否来自固定呼叫者(代理、ssis 等),然后如果没有设置它,我们可以假设它是临时的?

标签: sql-server stored-procedures ssis sql-agent-job


【解决方案1】:

我创建了以下 SPROC:

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 - Query”

然后我创建了一个作业来运行这个 SPROC。在TEST_LOG 中,Program_name 列是“SQLAgent - TSQL JobStep (Job 0xCB393E8FF0E9D44485204D0100803469 : Step 1)”

因此,如果您不想传递参数来指示它是否作为作业运行,我想您可以从sys.dm_exec_sessions.Program_name 中弄清楚

【讨论】:

  • 这可能不是理想的解决方案,它可能不适用于所有情况,但它应该适用于作业名称。谢谢。
【解决方案2】:

根据 Robert Paulsen 的建议,我创建了简单的解决方案来实现这一目标。

我还使用了该位置的一些代码将字符串转换为唯一标识符。它是由 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2016-03-23
    • 2012-01-23
    • 2020-11-21
    相关资源
    最近更新 更多