gpt4 book ai didi

sql-server - 我可以查看谁在我的 SQL Server 上启动了当前正在运行的作业吗?

转载 作者:行者123 更新时间:2023-12-03 14:52:57 30 4
gpt4 key购买 nike

我们最近构建了一个小型应用程序,允许我们的最终用户远程启动 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 和用户名,并以这种方式提取名称。

最佳答案

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

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;

它还不完美,因为还没有清理未关闭作业的维护,但它至少可以让我们弄清楚哪个用户开始了特定作业。

关于sql-server - 我可以查看谁在我的 SQL Server 上启动了当前正在运行的作业吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28107588/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com