如何从存储过程启用 SQL Server 代理作业执行

Posted

技术标签:

【中文标题】如何从存储过程启用 SQL Server 代理作业执行【英文标题】:How to enable SQL Server Agent job execution from stored procedure 【发布时间】:2019-04-05 13:37:34 【问题描述】:

我有一个执行.dtsx 包的代理作业。它需要从数据库用户拥有的存储过程中调用,并由应用程序使用并作为所有者执行。

授予

代码:

DECLARE @return_value INT

EXEC    @return_value = [dbo].[rscc_drop_off_caller]

SELECT  'Return Value' = @return_value

我给了用户SQLAgentUserRole 并确认它已在sp_start_job 上执行。

如果我跑:

DECLARE @ReturnCode INT;

EXEC @ReturnCode = msdb.dbo.sp_start_job N'RSCC Push CCD To AIM';

PRINT @ReturnCode;

从 SSMS 的一个窗口,它运行良好。

但如果我跑:

exec csisql.rscc_drop_off_caller; 

失败并出现错误:

消息 229,级别 14,状态 5,过程 sp_start_job,第 1 行 对象“sp_start_job”、数据库“msdb”、架构“dbo”的执行权限被拒绝。

“rscc_drop_off_caller”过程试图返回 NULL 状态,这是不允许的。将返回状态 0。

我什至在授予权限后尝试删除并重新创建存储过程,但我得到了同样的错误。存储过程非常简单:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[rscc_drop_off_caller]
WITH EXECUTE AS OWNER
AS
DECLARE @ReturnCode int;

BEGIN
    EXEC @ReturnCode = msdb.dbo.sp_start_job N'RSCC Push CCD To AIM';
    RETURN (@ReturnCode); 
END

对不起,如果我提供了太多信息。我真的需要让这个工作,但我很难过。任何帮助将非常感激。提前致谢。

KT

总结一下:我需要能够从存储过程中调用代理作业。尽管以拥有用户的身份直接调用作业(执行...),但目前失败了。

【问题讨论】:

结果中的某处应该是一行,上面写着“以 SomeUserName 身份执行”。这说明了什么,当您收到权限错误时,该用户拥有什么权限? 您在哪个数据库中创建了您的过程,在 msdb 中还是在用户数据库中? @sepucic 存储过程在 csisql 数据库中,这是一个用户数据库。 @Tab Alleman 我假设您的意思是在存储过程中?存储的过程由 dbo 用户拥有,但我已修改该过程以作为“DAimConnUser”执行(我授予 exec sp_start_job 权限的同一用户)。我还尝试修改程序以作为 CALLER 执行。都没有用。 【参考方案1】:

感谢您的帮助。我解决了这个问题。我修改了 SP 以作为调用者执行,并授予该 DAimConnUser 执行存储过程的特定权限。

【讨论】:

以上是关于如何从存储过程启用 SQL Server 代理作业执行的主要内容,如果未能解决你的问题,请参考以下文章

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

sql server:如何设置自动执行的存储过程?

如何修改 SQL Server 代理主作业 (Transact-SQL)

Sql Server代理作业

从SQL代理作业调用时,工作存储过程失败

使用存储过程将记录从 SQL Server 复制到 SQL Server (2005)