Sql-Server-2014
允許兩個使用者執行單個代理作業的權限
我試圖讓兩個使用者執行一個代理作業。考慮到這一點,我不想將使用者添加到
SQLAgentOperatorRole
msdb 中的角色,因為這會給他們額外的特權。我嘗試創建一個儲存過程,它將作為所有者(dbo)執行:
創建儲存過程(使用 sysadmin 帳戶登錄)
CREATE LOGIN [UnPriveleged] WITH PASSWORD = 'MyPassword' GO USE AdventureWorks2017 GO CREATE USER UnPriveleged FOR LOGIN [UnPriveleged] GO CREATE PROCEDURE spRunJOb WITH EXECUTE AS OWNER AS SELECT CURRENT_USER SELECT SYSTEM_USER EXEC msdb..sp_start_job @job_name = 'test' GO GRANT EXECUTE ON spRunJOb TO UnPriveleged
然後我在另一個會話中以 Unpriveleged 使用者身份執行它:
SELECT CURRENT_USER EXECUTE [spRunJOb]
我得到一個錯誤
Msg 229, Level 14, State 5, Procedure msdb..sp_start_job, Line 1 [Batch Start Line 0] The EXECUTE permission was denied on the object 'sp_start_job', database 'msdb', schema 'dbo'.
我認為這將作為儲存過程(sa)所有者的登錄名執行,因為它是系統管理員,應該能夠做所有事情。
我從選擇中獲得的輸出確認該過程正在以 sa 系統使用者身份執行。整體 SELECT 輸出為
Unpriveleged dbo sa
我怎樣才能在這裡實現我想要的?
這裡的問題是跨數據庫所有權連結,基本上一旦您離開 AdventureWorks 數據庫的上下文,您就沒有 dbo/sa 所暗示的提升權限,也無法在 msdb 中實際執行該過程。
您應該改為在 msdb 中重新創建儲存過程,並授予非特權使用者對 msdb 的 CONNECT 權限和對 msdb 中新過程的 EXECUTE 權限。
或者,您可以為 AdventureWorks 數據庫打開 TRUSTWORTHY,但通常這是不明智的。請參閱Aaron Bertrand 的此答案以獲取更多資訊以及許多解釋 TRUSTWORTHY 風險的重要連結。