Sql-Server

從另一個 SQL Server 實例啟動作業

  • May 3, 2019

我在 SQL 2008 伺服器(伺服器 A)上有一份工作(我知道這並不理想……這個問題正在解決中)。代理在 NT AUTHORITY\NETWORK SERVICE 下執行。

我想添加一個步驟來執行位於另一台 SQL 2014 伺服器(伺服器 B)上的作業。

我會使用:

EXEC [Server B].msdb..sp_start_job N'JobName'

從伺服器 A 手動執行,它按預期在伺服器 B 上執行作業。

如果我將任務添加到伺服器 A 上的作業,則會失敗並顯示以下消息:

以使用者身份執行:NT AUTHORITY\NETWORK SERVICE。對象“sp_start_job”、數據庫“msdb”、模式“dbo”的執行權限被拒絕。

$$ SQLSTATE 42000 $$(錯誤 229)。步驟失敗。

我已將伺服器 B 上的 NT AUTHORITY\NETWORK SERVICE 分配給 msdb 中的“TargetServerRole”,然後授予執行權限以關注使用者對 SP_Start_Job 和 SP_Stop_Job。

伺服器 A 將伺服器 B 作為連結伺服器,我嘗試將“本地伺服器登錄到遠端伺服器登錄映射”設置為本地登錄 NT AUTHORITY\NETWORK SERVICE 來模擬。

該作業仍然失敗並出現相同的錯誤。

我需要做什麼?

謝謝

您可能不想授予對或的直接訪問權限sp_start_job,或者甚至不希望通過,sp_stop_job授予對一系列 SQL 代理功能的訪問權限或。至少,執行這些組合中的任何一個都將允許在 ServerA 上執行的任何程序能夠啟動和/或停止 ServerB 上的任何作業。SQLAgentOperatorRole``NT AUTHORITY\NETWORK SERVICE``MyDomain\ServerA$``NT AUTHORITY\NETWORK SERVICE

使用Module Signing,您可以設置非常精細的權限,以便MyDomain\ServerA$(或任何登錄名或角色,或它們的任何組合)只能啟動和停止該特定作業。

USE [msdb];
GO
CREATE PROCEDURE dbo.StartStopJobX
(
 @Operation VARCHAR(10) = 'start'
)

AS
 IF (@Operation = 'start')
 BEGIN
   EXEC dbo.sp_start_job N'{job_name}';
 END
 ELSE
 BEGIN
   EXEC dbo.sp_stop_job N'{job_name}';
 END;
GO


CREATE CERTIFICATE [SqlAgentPermissions]
ENCRYPTION BY PASSWORD = 'change_me'
WITH SUBJECT = 'Allow low-priviledged accounts to start/stop certain jobs',
EXPIRY_DATE = '2099-12-31';

ADD SIGNATURE
 TO dbo.StartStopJobX
 BY CERTIFICATE [SqlAgentPermissions]
 WITH PASSWORD = 'change_me';

CREATE USER [SqlAgentPermissions] FROM CERTIFICATE [SqlAgentPermissions];

ALTER ROLE [SQLAgentOperatorRole] ADD MEMBER [SqlAgentPermissions];

現在你需要做的就是:

GRANT EXECUTE ON dbo.[StartStopJobX] TO [MyDomain\ServerA$];

引用自:https://dba.stackexchange.com/questions/237312