使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题

Posted

技术标签:

【中文标题】使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题【英文标题】:Using SMO.Agent to retrieve SQL job execution status - security issue 【发布时间】:2011-01-12 22:50:22 【问题描述】:

我有一个 C# 程序,它使用 SQL Server Management Objects (SMO) 接口触发 SQL Server Agent 作业。它看起来像:

Server ssis_server = new Server(
    new ServerConnection(SERVER_NAME, SERVER_USERNAME, SERVER_PASSWORD)
);

var agent = ssis_server.JobServer;
var ssis_job = agent.Jobs[job_name];

var current_status = ssis_job.CurrentRunStatus;

if (current_status == JobExecutionStatus.Idle)

    ssis_job.Start();
    OnSuccess("Job started: " + job_name);

else

    OnError("Job is already running or is not ready.");

我现在使用SQL Server Authentication 来简化事情,同时解决这个问题。

现在,我的问题是,除非SERVER_USERNAME 是“系统管理员”dbo 角色的一部分,否则ssis_job.CurrentRunStatus 始终是“Idle”——即使我知道作业正在运行。它不会出错,只是总是报告空闲。 如果用户是管理员,则按预期返回状态。

你说的角色成员资格? 好吧,我将SERVER_USERNAME SQL Server 登录添加到 msdb 角色 SQLAgentOperatorRole,这似乎没有帮助。 作业的所有者是系统管理员帐户 - 如果是这个问题,我不确定如何解决。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要在检查状态之前调用 ssis_job 上的 Refresh() 方法刷新作业,然后您将获得正确的信息。

【讨论】:

Refresh 对象上的 Refresh 方法为我修复了它。感谢您指出。 如果我在 Start() 之后立即调用 Refresh(),它对我不起作用。它在我调试代码时起作用。会不会是 Start() 和 sql 作业开始之间的延迟?

以上是关于使用 SMO.Agent 检索 SQL 作业执行状态 - 安全问题的主要内容,如果未能解决你的问题,请参考以下文章

使用T-SQL找出执行时间过长的作业

奇怪的 SQLException - 无法检索事务只读状态服务器

数据库定时执行sql mysql定时任务 event 执行定时任务 和sql server定时任务 作业执行定时任务

SQL 作业卡在执行 SQL 合并?

Oracle SQL 从执行计划中检索具有表名的列名作为表

向 SQL Server 用户授予执行权限以仅运行特定作业