執行系統資料庫管理任務所需的最低權限為何?
問題
在 BarTender 2019 及之後的版本中,執行 BarTender 系統資料庫管理工作所需的最低權限是什麼?
解答
伺服器角色:dbcreator 以及 資料庫角色:db_owner 是在管理主控台下執行所有 BarTender 系統資料庫管理工作所需的最低權限。
以下是管理主控台中各項任務所需權限的詳細說明:
| 動作/程序 | 最低權限 |
| 檢視資料庫大小 | 資料庫權限:檢視資料庫狀態 |
| 備份資料庫 |
資料庫權限:備份資料庫 備份檔案儲存的目錄必須已存在, 而且 SQL Server 服務必須對該目錄有讀寫權限。 |
| 還原資料庫 |
伺服器角色:dbcreator 資料庫角色:db_owner |
| 立即執行維護 |
資料庫權限:連線、刪除、執行、插入、查詢、更新, 備份資料庫(如果有勾選「封存已刪除記錄」選項) |
| 立即清除所有記錄 |
資料庫權限:連線、刪除、執行、插入、查詢、更新,備份資料庫(如果有勾選「封存已刪除記錄」選項) 資料庫角色:db_ddladmin |
不過,即使擁有正確的權限,目前已知在執行維護作業時,如果執行者沒有 sysadmin 角色,仍然會失敗。錯誤訊息會類似以下內容:
Stored Procedure: sp_updatestats Failed; Inner Message: User does not have permission to perform this action.
Processed 584 pages for database 'SystemDB', file 'SystemDB' on file 1.
Processed 1 pages for database 'SystemDB', file 'SystemDB_log' on file 1.
BACKUP DATABASE successfully processed 585 pages in 0.091 seconds (50.217 MB/sec).
這是已知的 SQL Server 問題。在維護作業中使用的其中一個預存程序 'SpDeleteRecords' 會呼叫 SQL Server 內建程序 'sp_updatestats',這是為了在刪除記錄後提升查詢效能。
很遺憾的是,雖然微軟官方文件指出資料庫擁有者(dbo)有權執行這個程序,但目前 SQL Server 有個錯誤會導致執行失敗。
解決方法是請客戶透過 SQL Server Management Studio 修改 'SpDeleteRecords' 預存程序,步驟如下:
在 SQL Server Management Studio 左側窗格中,於「YourDatabase\Programmability\Stored Procedures」下,右鍵點選 dbo.SpDeleteRecords,選擇「Script Stored Procedure as ALTER to > New Query Editor Window」產生 ALTER 腳本。
在腳本的 ALTER 行後面加上 "with execute as 'dbo'",如下所示:
ALTER PROC [dbo].[SpDeleteRecords](@pastUtcTicks bigint, @categories nvarchar(1024)) with execute as 'dbo'
按下 F5 或工具列上的「! 執行」按鈕來執行這個腳本。
這樣會強制 'SpDeleteRecords' 以資料庫擁有者的身分執行。修改預存程序後,請再以上述表格中的最低權限嘗試執行維護作業,應該就能順利完成。
更多資訊(僅供內部使用)
請參閱 DEVQ-4363 和 BUG-2270
此外,遲早會有客戶質疑為什麼必須給予某些伺服器角色或資料庫權限,並認為這會造成安全風險(例如 db_owner)。事實上,我今天就收到客戶這樣的提問,以下是我的回覆:
與其從 SQL Server 使用者擁有什麼資料庫角色的角度來看,我會從以下角度來思考:
- BarTender 系統資料庫所用的 SQL Server 帳號密碼是否足夠複雜且安全?
- 公司內有誰知道或能取得這個密碼。
如果詢問 SQL Server 管理員,db_owner 資料庫權限本身就有安全疑慮,但我認為最重要的是誰能取得這個帳號的密碼,以及密碼的複雜度。