Il est possible de configurer une méthode pour accorder des droits d'exécution d'un travail qu'un utilisateur ne dispose pas des droits suffisants pour s'exécuter seul.
EDIT: pour plus de clarté sur les trois options présentées en mentionnant explicitement SQLAgentOperatorRole comme option et en ajoutant quelques explications sur la troisième solution.
(1) Si l'utilisateur est autorisé à gérer l'exécution de tous les travaux, faites de cet utilisateur un membre de SQLAgentOperatorRole. L'utilisateur pourra démarrer (ainsi qu'arrêter, activer et désactiver) tout travail de l'Agent SQL sur ce serveur. (Cette solution s'est avérée satisfaire le demandeur initial.)
(2) Erland Sommarskog a beaucoup écrit sur la façon d'accorder des autorisations via des procédures stockées utilisant des contre-signatures. Il a une solution à:
http://www.sommarskog.se/grantperm.html#countersignatures
Le point clé est: "Pour pouvoir démarrer un travail appartenant à quelqu'un d'autre, vous devez être membre du rôle fixe SQLAgentOperatorRole
dans msdb
. Un début consiste à écrire une procédure stockée qui appelle sp_start_job
pour ce travail spécifique, signer cette procédure avec un certificat , puis créez un utilisateur à partir du certificat et faites-en un membre SQLAgentOperatorRole
. "
(3) Ma résolution générale était de créer une StartAgentJob
procédure stockée dans la msdb
base de données permettant à un utilisateur de démarrer des travaux appartenant à quelqu'un d'autre.
Cela nécessite une table pour conserver la configuration de qui peut exécuter quel travail. Étant donné que le dbo.msdbJobMap
tableau suivant est spécifique au travail de l'Agent SQL Server, je créerais le tableau dans msdb
. Mais il pourrait être créé dans une autre base de données de services si vous le souhaitez.
USE msdb;
/* Create a table to hold configuration of who can start jobs. */
CREATE TABLE dbo.msdbJobMap
(job_name NVARCHAR(128),
group_name NVARCHAR(256));
/* Populate the table of allowed groups for a job
A group may be a single user or a Windows group. */
INSERT INTO dbo.msdbJobMap Values (N'Test it out',N'Domain\Group');
INSERT INTO dbo.msdbJobMap Values (N'Another job',N'Domain\OtherGroup');
INSERT INTO dbo.msdbJobMap Values (N'Special job',N'Domain\Joe');
INSERT INTO dbo.msdbJobMap Values (N'Special job',N'Domain\Andre');
La procédure stockée permet également à tout membre d'un groupe spécifié de démarrer un travail car il utilise IS_MEMBER
pour vérifier l'appartenance au groupe.
CREATE PROCEDURE dbo.StartAgentJob
@Job_Name NVARCHAR(128)
WITH EXECUTE AS OWNER
AS
SET NOCOUNT ON;
DECLARE @Allowed INT;
SET @Allowed = 0;
/* Since this runs as sysadmin need to check group membership of original login*/
EXECUTE AS LOGIN = ORIGINAL_LOGIN();
IF EXISTS (SELECT * FROM dbo.msdbJobMap
WHERE job_name = @Job_Name
AND IS_MEMBER(group_name) = 1 )
SET @Allowed = 1;
REVERT;
/* Back to sysadmin so that we can start the job. */
IF @Allowed = 1
EXEC sp_start_job @job_name = @Job_Name;
ELSE
PRINT 'Invalid attempt to start ''' + QUOTENAME(@Job_Name)+'''';
RETURN;
Comme vous pouvez le voir, la procédure dépend de l'exécution comme sysadmin
dans msdb
. En passant au contexte de la, ORIGINAL_LOGIN
il peut utiliser IS_MEMBER
pour vérifier que les ORIGINAL_LOGIN
droits ont bien été accordés via la dbo.msdbJobMap
table. Ensuite, il redevient sysadmin
tel qu'il peut commencer le travail.
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb
était tout ce dont j'avais besoin (bien que le code que vous avez publié semble utile). L'utilisateur est autorisé à exécuter n'importe quel travail. Merci beaucoup!