Можно настроить метод для предоставления прав на выполнение задания, для которого у пользователя недостаточно прав для самостоятельного запуска.
РЕДАКТИРОВАТЬ: Для ясности в трех представленных опциях, явно упомянув SQLAgentOperatorRole в качестве опции и добавив некоторые пояснения по третьему решению.
(1) Если пользователю разрешено управлять выполнением всех заданий, сделайте этого пользователя членом SQLAgentOperatorRole. Пользователь сможет запускать (а также останавливать, включать и отключать) любое задание агента SQL на этом сервере. (Оказалось, что это решение удовлетворяло первоначальный вопрос.)
(2) Эрланд Соммарског много писал о том, как предоставлять разрешения с помощью хранимых процедур с использованием контрподписей. У него есть решение по адресу:
http://www.sommarskog.se/grantperm.html#countersignatures
Ключевой момент здесь является: « Для того, чтобы иметь возможность начать работу , принадлежащую кому - то еще, вы должны быть членом фиксированной роли SQLAgentOperatorRole
в msdb
Стартовом должны написать хранимую процедуру , которая вызовы. sp_start_job
Для этой конкретной работы, подписать эту процедуру с сертификатом и затем создайте пользователя из сертификата и сделайте его участником SQLAgentOperatorRole
. "
(3) Моим общим решением было создание StartAgentJob
хранимой процедуры в msdb
базе данных, позволяющей пользователю запускать задания, принадлежащие кому-то другому.
Для этого требуется таблица для настройки того, кто может выполнять какое задание. Поскольку следующая dbo.msdbJobMap
таблица является специфичной для задания агента SQL Server, я бы создал таблицу в msdb
. Но при желании он может быть создан в другой базе данных сервиса.
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');
Хранимая процедура также позволяет любому члену указанной группы запускать задание, поскольку она используется IS_MEMBER
для проверки членства в группе.
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;
Как видите, процедура зависит от запуска, как sysadmin
в msdb
. Переключаясь в контекст, ORIGINAL_LOGIN
его можно использовать IS_MEMBER
для проверки того, что ORIGINAL_LOGIN
действительно были предоставлены права через dbo.msdbJobMap
таблицу. Затем он возвращается к тому, sysadmin
чтобы начать работу.
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb
все, что мне было нужно (хотя код, который вы разместили, выглядит полезным). Пользователь может выполнять любую работу. Большое спасибо!