ユーザーが自分で実行するのに十分な権限を持っていないジョブを実行する権限を付与するメソッドを設定することが可能です。
編集: SQLAgentOperatorRoleをオプションとして明示的に言及し、3番目のソリューションにいくつかの説明を追加することによって提示される3つのオプションを明確にするため。
(1)ユーザーがすべてのジョブの実行を管理できる場合は、そのユーザーをSQLAgentOperatorRoleのメンバーにします。ユーザーは、そのサーバーでSQLエージェントジョブを開始(および停止、有効化、無効化)できます。 (このソリューションは、元の質問者を満足させることがわかりました。)
(2) Erland Sommarskogは、副署名を使用してストアドプロシージャを通じてアクセス許可を付与する方法について多くのことを書いています。彼は解決策を持っています:
http://www.sommarskog.se/grantperm.html#countersignatures
重要なポイントは次のとおりです。「誰か他の人が所有しているジョブを開始できるようにするには、固定ロールのメンバーである必要がSQLAgentOperatorRole
中msdb
Aの開始は通話というストアドプロシージャを記述することである。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
実際に必要なのはそれだけでした(ただし、投稿したコードは便利に見えます)ユーザーは、任意のジョブを実行することが信頼されています。どうもありがとう!