Tôi cần cho phép người dùng khởi động một công việc đại lý cụ thể mà không có bất kỳ khả năng nào để bắt đầu những công việc khác. Để thực hiện điều này, tôi đã tạo quy trình sau (đơn giản hóa):
ALTER PROCEDURE [dbo].[RunJob]
@job_name nvarchar(200)
WITH EXECUTE AS 'sysadminaccount'
AS
BEGIN
--SET NOCOUNT ON;
BEGIN TRY
EXEC msdb.dbo.sp_start_job @job_name = @job_name
-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL
DECLARE @job_result AS INT = NULL
WHILE 1=1
BEGIN
SELECT TOP 1 @job_history_id = activity.job_history_id
FROM msdb.dbo.sysjobs jobs
INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
WHERE jobs.name = @job_name
ORDER BY activity.start_execution_date DESC
IF @job_history_id IS NULL
BEGIN
WAITFOR DELAY '00:00:01'
CONTINUE
END
ELSE
BREAK
END
-- Check exit code
SET @job_result = (SELECT history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id)
RETURN @job_result;
END TRY
BEGIN CATCH
THROW;
RETURN;
END CATCH
END
Tuy nhiên, khi tôi gọi thủ tục này (đã xác minh nó đang chạy qua "sysadminaccount"), tôi nhận được thông báo lỗi sau:
Msg 229, Cấp 14, Trạng thái 5, Quy trình sp_start_job, Dòng 1 Quyền EXECUTE đã bị từ chối trên đối tượng 'sp_start_job', cơ sở dữ liệu 'msdb', lược đồ 'dbo'.
Tài khoản là một thành viên của vai trò sysadmin, vì vậy tôi hiểu rằng không nên có bất kỳ vấn đề nào khi bắt đầu công việc. Tôi đã xác minh rằng nó là thành viên của ba vai trò sqlagent trong msdb và tất cả các vai trò đó đều có quyền thực thi sp_start_job
.
Làm cách nào tôi có thể cấp cho tài khoản này các quyền phù hợp? Có điều gì khác cần phải được thực hiện vì sự mạo danh?