我能看到谁在我的SQL Server上启动了当前正在运行的作业吗?

时间:2015-01-23 10:16:42

标签: sql-server

我们最近构建了一个小应用程序,允许我们的最终用户远程启动SQL Server上的作业。要确定作业是否已在运行,我们使用以下查询:

SELECT 
    sj.job_id
    , name
FROM 
    msdb.dbo.sysjobactivity AS sja
    INNER JOIN msdb.dbo.sysjobs AS sj 
        ON sja.job_id = sj.job_id
WHERE 
    sja.start_execution_date IS NOT NULL
        AND sja.stop_execution_date IS NULL

这就像魅力一样,但理想情况下,如果作业已经开始,我们还希望显示启动相关工作的用户的ID /名称。

我检查了不同的sysjobs *表,但无法找到任何可以让我们获取该信息的列。

我希望我只是忽略了某些东西,而且有人能够帮助我找到完成这项工作的捷径。我的替代方案是在作业启动时添加一个我自己的额外表,其中包含作业ID和用户名,并以此方式提取名称。

2 个答案:

答案 0 :(得分:0)

检查

SELECT TOP 10 * FROM msdb.dbo.sysjobhistory 
  

以用户身份执行:xxx \ yyyy。这一步成功了。

答案 1 :(得分:0)

我们最终构建了自己的表来存储正在启动的作业的详细信息:

CREATE TABLE [dbo].[dwh_jobs](
    [job_id] [uniqueidentifier] NOT NULL,
    [started_by_user_name] [nvarchar](255) NOT NULL,
    [start_time] [datetime] NOT NULL,
    [end_time] [datetime] NULL,
    [run_time] [nvarchar](250) NULL,
    [rows_affected] [bigint] NULL DEFAULT ((0))
)

然后我们创建了几个存储过程来记录正在启动的作业的开始和结束时间:

CREATE PROCEDURE [dbo].[usp_job_start]
    @job_id uniqueidentifier
    , @started_by_user_name nvarchar(255) 
    , @start_time datetime
AS 
BEGIN
    INSERT INTO msdb.dbo.dwh_jobs 
        (job_id, started_by_user_name, start_time, end_time, run_time, rows_affected)
    VALUES
        (@job_id, @started_by_user_name, @start_time, NULL, NULL, 0)
END

这是结束过程:

CREATE PROCEDURE [dbo].[usp_job_end]
    @job_id uniqueidentifier
    , @started_by_user_name nvarchar(255) 
    , @start_time datetime
    , @end_time datetime
    , @run_time nvarchar(255)
    , @rows_affected bigint
AS 
BEGIN
    UPDATE msdb.dbo.dwh_jobs 
    SET 
        end_time = @end_time
        , run_time = @run_time
        , rows_affected = @rows_affected
    WHERE
        job_id = @job_id
        AND started_by_user_name = @started_by_user_name
        AND start_time = @start_time
        AND end_time IS NULL
        AND run_time IS NULL
        AND rows_affected = 0
END;

最后,我们添加了一个proc来查找哪个用户启动了某个特定的工作:

CREATE PROCEDURE [dbo].[usp_job_lookup_user]
    @job_id uniqueidentifier
    , @started_by_user_name nvarchar(255) OUTPUT
AS 
BEGIN
    SELECT 
        @started_by_user_name = started_by_user_name
    FROM
        msdb.dbo.dwh_jobs
    WHERE
        start_time = (SELECT MAX(start_time) FROM msdb.dbo.dwh_jobs 
            WHERE job_id = @job_id AND end_time IS NULL)

END;

它还不完美,因为还没有维护来清理非封闭的工作,但它可以让我们至少弄清楚哪个用户开始了某个特定的工作。 / p>