È possibile impostare un metodo per concedere i diritti per eseguire un lavoro che un utente non dispone dell'autorizzazione sufficiente per eseguire da solo.
EDIT: per chiarezza sulle tre opzioni presentate citando esplicitamente SQLAgentOperatorRole come opzione e aggiungendo alcune spiegazioni sulla terza soluzione.
(1) Se l'utente è autorizzato a gestire l'esecuzione di tutti i lavori, rendere tale utente membro di SQLAgentOperatorRole. L'utente sarà in grado di avviare (nonché arrestare, abilitare e disabilitare) qualsiasi processo di Agente SQL su quel server. (Questa soluzione si è rivelata soddisfacente per il richiedente originale.)
(2) Erland Sommarskog ha scritto molto su come concedere le autorizzazioni attraverso procedure memorizzate che utilizzano controfirme. Ha una soluzione a:
http://www.sommarskog.se/grantperm.html#countersignatures
Il punto chiave è: "Per poter avviare un lavoro di proprietà di qualcun altro, devi essere membro del ruolo fisso SQLAgentOperatorRolein msdb. Un inizio è scrivere una procedura memorizzata che richiede sp_start_jobquesto lavoro specifico, firmare quella procedura con un certificato e quindi creare un utente dal certificato e renderlo membro di SQLAgentOperatorRole".
(3) La mia risoluzione generale era quella di creare una StartAgentJobprocedura memorizzata nel msdbdatabase che consentisse a un utente di avviare lavori di proprietà di qualcun altro.
Ciò richiede una tabella per mantenere la configurazione di chi può eseguire quale lavoro. Poiché la dbo.msdbJobMaptabella seguente è specifica del lavoro dell'agente di SQL Server, vorrei creare la tabella msdb. Ma potrebbe essere creato in qualche altro database di servizio, se lo si desidera.
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 procedura memorizzata consente inoltre a qualsiasi membro di un gruppo specificato di avviare un processo poiché viene utilizzato IS_MEMBERper verificare l'appartenenza al gruppo.
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;
Come puoi vedere, la procedura dipende dall'esecuzione come sysadminin msdb. Passando al contesto di ORIGINAL_LOGINesso è in grado IS_MEMBERdi verificare se i ORIGINAL_LOGINdiritti sono stati effettivamente concessi attraverso la dbo.msdbJobMaptabella. Quindi torna ad essere in sysadminmodo che possa iniziare il lavoro.
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdbera tutto ciò di cui avevo effettivamente bisogno (anche se il codice che hai pubblicato sembra utile). L'utente ha la fiducia di eseguire qualsiasi lavoro. Molte grazie!