È 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 SQLAgentOperatorRole
in msdb
. Un inizio è scrivere una procedura memorizzata che richiede sp_start_job
questo 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 StartAgentJob
procedura memorizzata nel msdb
database 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.msdbJobMap
tabella 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_MEMBER
per 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 sysadmin
in msdb
. Passando al contesto di ORIGINAL_LOGIN
esso è in grado IS_MEMBER
di verificare se i ORIGINAL_LOGIN
diritti sono stati effettivamente concessi attraverso la dbo.msdbJobMap
tabella. Quindi torna ad essere in sysadmin
modo 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 msdb
era 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!