SET IDENTITY_INSERT 的權限是否低於 db_ddladmin?
我繼承了一個應用程序在
sysadmin
帳戶下執行的系統。我將此帳戶限制為所有數據庫上的db_datareader
++並設置會話以在伺服器上擷取。即使使用者是其中的成員並且對錶沒有應用粒度限制, 看到一些失敗也讓我感到非常驚訝。db_datawriter``EXECUTE``extended events``permission errors
inserts``db_datawriter
然後我注意到只有插入該集合
IDENTITY_INSERT
失敗。有問題的數據庫已經滿了,identity
而且他們的程式碼太多了SET IDENTITY_INSERT
。程式碼不僅意味著modules
儲存在伺服器上,還意味著C#
程式碼。為了能夠設置
identity_insert
使用者必須擁有該表或對該表具有ALTER
權限。但事實是你不能ALTER
只授予表,我被迫授予ALTER
整個數據庫給這個user
(我會讓這個db_ddladmin
角色的使用者成員只添加 42 個權限(!!!) vs 51 個權限,可以通過授予ALTER
數據庫添加到使用者權限)我對重構數據庫不感興趣
sequence
(伺服器版本是2014
這樣我理論上可以做到)而且我不能只添加execute as dbo
到每個使用的 spidentity_insert
因為還有應用程式碼要重寫,我只是想知道為什麼微軟會做這麼奇怪db_datawriter
無法設置的權限設計identity_insert
?是否有其他方法可以使使用者能夠設置
identity_insert
添加的權限少於db_ddladmin
?更新
我嘗試了LowlyDBA提供的解決方案
synonyms
:create table dbo.t(id int identity); go alter schema sch transfer dbo.t; go create synonym dbo.t for sch.t; go set IDENTITY_INSERT dbo.t on;
這會導致錯誤
消息 1088,級別 16,狀態 11,第 1 行找不到對象“dbo.t”,因為它不存在或您沒有權限。
Antoine Hernandez
僅在模式上授予使用者ALTER的解決方案似乎是邪惡的,所以我接受它
我建議您通過右鍵點擊數據庫角色文件夾來創建自定義數據庫角色。
這將調出您可以自定義的數據庫角色。在第一個螢幕上,您可以為角色指定您選擇的名稱和所有者。您還可以添加您希望成為該角色成員的使用者。
完成後,您可以點擊 Securables,然後您可以選擇要授予的內容。
添加對象將顯示,我建議選擇“所有類型的對象…”選項,然後點擊確定。
在 Select Object Types 中,向下滾動以查找 Schemas,選中該框,然後點擊 OK。
現在您將看到一個架構列表,因此請選擇具有您要授予權限的對象的架構,它將在下面顯示該架構的權限。
對於此範例,我選擇了 dbo 模式。我調整了預設螢幕的大小以一次顯示更多。
在這種情況下,我很可能會選擇授予 Alter,因為根據Microsoft的說法,“當授予範圍時,ALTER 還賦予更改、創建或刪除(強調我的)該範圍內包含的任何安全對象的能力。” 根據關於數據庫權限的資訊圖,位於此處和下方,在架構上授予 Alter 將在 Aggregate、Default、Function、Procedure、Queue、Rule、Synonym、Table 和 View 上授予 alter:由於我處於這個階段,對於同一個角色,我可能也會授予 Execute 權限,因此角色成員也可以執行任何儲存過程,因此當新表或儲存過程添加到數據庫時,我不必修改任何安全性以允許新對象像現有對像一樣工作。因此,一旦完成,選擇將如下所示:
我本可以更進一步,還授予 Select、Insert、Update 和 Delete 權限,它很可能涵蓋了角色讀取、插入、刪除和更新任何表以及執行任何儲存過程所需的一切無需授予 db_ddladmin 角色授予的所有其他權限。通過在模式級別執行此操作,它可以在某些方面簡化安全管理,特別是當特定使用者需要在模式級別具有大量(如果不是全部)訪問權限時,但也滿足不授予整體更改權限的要求數據庫。如果此配置授予角色不需要的其他權限,則可以根據需要添加 DENY 權限。