Dimungkinkan untuk mengatur metode untuk memberikan hak untuk menjalankan pekerjaan yang pengguna tidak memiliki cukup otoritas untuk berjalan sendiri.
EDIT: Untuk memperjelas tiga opsi yang disajikan dengan secara eksplisit menyebutkan SQLAgentOperatorRole sebagai opsi dan dengan menambahkan beberapa penjelasan tentang solusi ketiga.
(1) Jika pengguna diizinkan untuk mengelola eksekusi semua pekerjaan, maka buatlah anggota pengguna itu SQLAgentOperatorRole. Pengguna akan dapat memulai (serta menghentikan, mengaktifkan, dan menonaktifkan) pekerjaan SQL Agent di server itu. (Solusi ini ternyata memuaskan penanya yang asli.)
(2) Erland Sommarskog telah menulis banyak tentang cara memberikan izin melalui prosedur tersimpan menggunakan tanda tangan tandingan. Dia punya solusi di:
http://www.sommarskog.se/grantperm.html#countersignatures
Titik kunci adalah: "Untuk dapat memulai pekerjaan yang dimiliki oleh orang lain, Anda harus anggota dari peran tetap SQLAgentOperatorRole
di msdb
Awal adalah untuk menulis prosedur tersimpan bahwa panggilan. sp_start_job
Untuk pekerjaan tertentu, menandatangani prosedur yang dengan sertifikat , lalu buat pengguna dari sertifikat dan jadikan pengguna itu anggota SQLAgentOperatorRole
. "
(3) Resolusi umum saya adalah membuat StartAgentJob
prosedur tersimpan dalam msdb
database yang memungkinkan pengguna untuk memulai pekerjaan yang dimiliki oleh orang lain.
Ini membutuhkan tabel untuk mempertahankan konfigurasi siapa yang dapat menjalankan pekerjaan mana. Karena dbo.msdbJobMap
tabel berikut ini adalah SQL Server Agent Job spesifik, saya akan membuat tabel di msdb
. Tapi itu bisa dibuat di beberapa basis data layanan lain jika diinginkan.
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');
Prosedur tersimpan juga memungkinkan setiap anggota dari kelompok tertentu untuk memulai pekerjaan karena digunakan IS_MEMBER
untuk memeriksa keanggotaan grup.
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;
Seperti yang Anda lihat, prosedurnya tergantung pada menjalankan seperti sysadmin
pada msdb
. Dengan beralih ke konteks ORIGINAL_LOGIN
itu dapat digunakan IS_MEMBER
untuk memeriksa bahwa ORIGINAL_LOGIN
memang telah diberikan hak melalui dbo.msdbJobMap
tabel. Kemudian kembali menjadi sysadmin
sehingga dapat memulai pekerjaan.
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb
itu yang saya butuhkan sebenarnya (walaupun kode yang Anda posting terlihat berguna). Pengguna dipercaya untuk menjalankan pekerjaan apa pun. Terima kasih banyak!