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?
quelle
TRUSTWORTHY
: sqlity.net/de/1653/… sqlity.net/de/1701/… sqlity.net/de/1710/… - Die Baugruppenteile sind wahrscheinlich nicht relevant, überprüfen Sie jedoch auch diese KB- Unterstützung. microsoft.com/kb/2183687 & dba.stackexchange.com/a/25894/1186Ich stimme voll und ganz zu, dass TRUSTWORTHY einem Ansatz nicht allzu vertrauenswürdig ist. Sie sollten einen anderen Weg wählen, um das gewünschte Ergebnis zu erzielen.
Ich habe kürzlich eine Möglichkeit veröffentlicht, einem anderen Benutzer oder einer Gruppe von Benutzern den Start eines SQL Agent-Jobs zu gewähren. Sie können es sehen bei:
Erlauben Sie Nicht-Sysadmin, Nicht-Eigentümer eines SQL Server-Agent-Jobs, ihn auszuführen
Die dritte Option, eine Sicherheitstabelle und eine gespeicherte Prozedur, bietet Ihnen die größte Flexibilität und die geringste Gefährdung.
quelle
In SQL Server:
Gehen Sie einfach zu Sicherheit-> Schema-> dbo. Doppelklicken Sie auf dbo ... und klicken Sie dann auf die Registerkarte Berechtigung -> (blaue Schrift), um die Datenbankberechtigung anzuzeigen, und scrollen Sie nach den erforderlichen Feldern wie "Ausführen" mit der Auswahl .... und gewähren, mit gewähren oder Kontrollen verweigern .... hoffe, dies wird helfen
quelle