如何从存储过程启用 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 代理作业中找不到存储过程错误