【发布时间】: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 执行。都没有用。
标签: sql-server stored-procedures sql-agent-job