查看 SQL Server 作業日誌的角色
我們有一個監控工具,可以檢查 Microsoft SQL Server 作業是否成功執行。我想要做的是創建一個權限盡可能少的使用者,但它必須能夠查看歷史日誌以查看作業是否完成。
我應該為使用者分配什麼角色?
編輯:伺服器是 Microsoft SQL Server 2005 到 2012
為了能夠檢查您需要的所有作業,請將使用者添加到 msdb 數據庫中的SQLAgentReaderRole中,這也授予該使用者創建作業的權限。要最小化授予的訪問權限,您還可以授予使用者對 sql server 代理使用的表的選擇權限
如果“查看歷史日誌以查看作業是否完成”可以通過使用儲存過程、標量函式或表值函式(而不是直接
SELECT
訪問msdb.dbo.sysjob*
表)來完成,那麼您可以在不授予任何權限的情況下逃脫對將要登錄的任何真實登錄名/使用者完全擁有權限。您仍將創建至少一個登錄名,並且可能還創建一個使用者(但可能不會),但任何人或應用程式碼都不會使用此登錄名連接到 SQL Server . 這個想法是使用模組簽名通過代理/間接授予權限。我在以下答案中詳細介紹了該方法(嗯,這是此特定用法的第一部分):我需要向使用者提供哪些最低權限才能檢查 SQL Server 代理服務的狀態?
此案例與該答案中的案例之間的區別在於,查看 DMV 資訊所需的伺服器級別權限不是伺服器級別的權限,而是這裡需要數據庫級別的角色。因此,超對外連結接答案中討論的其他步驟是:
- 無需授予
VIEW SERVER STATE
登錄伺服器級權限- 將證書也恢復到
msdb
msdb
從該證書創建使用者- 授予使用者
msdb
數據庫角色SQLAgentReaderRole
如果您想一次只檢查一個作業,您可以創建一個接受作業名稱參數的儲存過程或標量函式。或者,如果您想獲取多個作業的狀態,您可以創建一個表值函式。在這兩種情況下,您都在該儲存過程或函式中提供查詢,並僅向任何人授予對該儲存過程或函式的訪問權限。此方法允許您僅授予對該查詢的訪問權限,而不是該
SQLAgentReaderRole
角色所暗示的任何其他內容。或者,您可以通過為任何所需查詢所需的每個表創建一個表值函式(或者某些 JOIN 可以在某些 TVF 中完成)並對其進行簽名,從而允許更自由形式的即席查詢訪問。然後,您授予
SELECT
這些 TVF 權限的任何人都可以進行自己的查詢。唯一的缺點是 TVF 需要是多語句的並且不能是內聯 TVF,但對於這種特殊情況,在大多數情況下應該沒問題,因為這些查詢不應該每秒執行多次;-)。