從另一個 SQL Server 實例啟動作業
我在 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$];