Có thể thiết lập một phương thức để cấp quyền để chạy một công việc mà người dùng không có đủ thẩm quyền để tự mình chạy.
EDIT: Để rõ ràng về ba tùy chọn được trình bày bằng cách đề cập rõ ràng SQLAgentOperatorRole như một tùy chọn và bằng cách thêm một số giải thích về giải pháp thứ ba.
(1) Nếu người dùng được phép quản lý việc thực hiện tất cả các công việc, thì hãy tạo thành viên người dùng đó của SQLAgentOperatorRole. Người dùng sẽ có thể bắt đầu (cũng như dừng, bật và tắt) mọi công việc của Tác nhân SQL trên máy chủ đó. (Giải pháp này hóa ra để thỏa mãn người hỏi ban đầu.)
(2) Erland Sommarskog đã viết rất nhiều về cách cấp quyền thông qua các thủ tục được lưu trữ bằng cách sử dụng chữ ký phản đối. Ông có một giải pháp tại:
http://www.sommarskog.se/grantperm.html#countersignatures
Điểm mấu chốt là: "Để có thể bắt đầu một công việc thuộc sở hữu của người khác, bạn cần phải là thành viên của vai trò cố định SQLAgentOperatorRole
trong msdb
Một khởi đầu là viết một thủ tục lưu trữ các cuộc gọi. sp_start_job
Cho công việc cụ thể này, ký thủ tục giấy chứng nhận và sau đó tạo người dùng từ chứng chỉ và biến người dùng đó thành thành viên SQLAgentOperatorRole
. "
(3) Nghị quyết chung của tôi là tạo ra một StartAgentJob
thủ tục được lưu trữ trong msdb
cơ sở dữ liệu cho phép người dùng bắt đầu các công việc thuộc sở hữu của người khác.
Điều này đòi hỏi một bảng để duy trì cấu hình của những người có thể chạy công việc nào. Vì dbo.msdbJobMap
bảng sau đây là SQL Server Agent cụ thể, tôi sẽ tạo bảng trong msdb
. Nhưng nó có thể được tạo trong một số cơ sở dữ liệu dịch vụ khác nếu muốn.
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');
Quy trình được lưu trữ cũng cho phép bất kỳ thành viên nào của một nhóm được chỉ định bắt đầu một công việc vì nó sử dụng IS_MEMBER
để kiểm tra tư cách thành viên của nhóm.
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;
Như bạn có thể thấy, thủ tục phụ thuộc vào việc chạy như sysadmin
trong msdb
. Bằng cách chuyển sang bối cảnh của ORIGINAL_LOGIN
nó, nó có thể được sử dụng IS_MEMBER
để kiểm tra xem ORIGINAL_LOGIN
thực sự đã được cấp quyền thông qua dbo.msdbJobMap
bảng chưa. Sau đó, nó trở lại để sysadmin
có thể bắt đầu công việc.
To be able to start a job owned by someone else, you need to be member of the fixed role SQLAgentOperatorRole in msdb
là tất cả những gì tôi cần thực sự (mặc dù mã bạn đăng có vẻ hữu ích). Người dùng được tin tưởng để chạy bất kỳ công việc. Cảm ơn rất nhiều!