Ich muss einem Benutzer erlauben, einen bestimmten Agentenjob zu kündigen, ohne andere starten zu können. Um dies zu erreichen, habe ich das folgende Verfahren (vereinfacht) erstellt:
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
Wenn ich diese Prozedur aufrufe (nachdem ich überprüft habe, dass sie über "sysadminaccount" ausgeführt wird), wird folgende Fehlermeldung angezeigt:
Nachricht 229, Ebene 14, Status 5, Prozedur sp_start_job, Zeile 1 Die EXECUTE-Berechtigung wurde für das Objekt 'sp_start_job', Datenbank 'msdb', Schema 'dbo' verweigert.
Der Account ist ein Mitglied der Sysadmin-Rolle, daher sollte es meines Wissens keine Probleme geben, Jobs zu starten. Ich habe überprüft, dass es ein Mitglied der drei sqlagent-Rollen in msdb ist, und diese Rollen haben alle Ausführungsberechtigung für sp_start_job
.
Wie kann ich diesem Konto die entsprechenden Berechtigungen erteilen? Gibt es noch etwas, das wegen des Identitätswechsels getan werden muss?