如果 CONTROL 被拒絕,則使用者在具有 SELECT 權限時無法從表中選擇
我正在 Azure SQL Server 實例上設置我的數據庫。
(我知道主體名稱很糟糕,這只是一個空執行測試)
我創建了一個登錄名(“Test”),一個使用者(“Test”),一個模式(“Test”),向模式中添加了一個表(“ TestTable”,創建角色(“TestWriter”),為模式設置角色權限並將使用者添加到角色中。
我授予該角色以下權限:
GRANT INSERT, SELECT, UPDATE ON SCHEMA::Test TO TestWriter GO
並拒絕所有其他權限,遵循“最少權限”的做法(即只給予角色/使用者所需的最低權限):
DENY DELETE, ALTER, CONTROL, EXECUTE, REFERENCES, TAKE OWNERSHIP, VIEW DEFINITION ON SCHEMA::Test TO TestWriter GO
但是,在模式中選擇和/或插入表時出現錯誤,錯誤是
The INSERT permission was denied on the object 'TestTable', database 'TestDb', schema 'Test'.
通過反複試驗,我發現如果我
GRANT
CONTROL
對該角色有權限,問題就解決了。但是,從我閱讀的內容來看,我
CONTROL
不想隨便授予任何只需要 SELECT/INSERT 到表中的人。有什麼我想念的嗎?CONTROL
是否可以在沒有權限的情況下選擇/插入/更新表?
您不必顯式
DENY
授予任何這些權限,因為 SQL Server 是隱式 的 deny-first,這意味著Login / User / Security Principal(例如Role)在您明確授予訪問權限之前無權訪問任何內容(通過腳本使用GRANT
關鍵字的 T-SQL 或使用SSMS提供的 UI)。明確拒絕許可甚至優於明確的GRANT
.可以這樣想,權限可以處於三種狀態,SQL Server 中權限的優先順序(最高優先級在前)的工作方式如下:顯式
DENY
>顯式GRANT
>隱式 拒絕優先(預設)通過顯式授予
CONTROL
,您並沒有解決問題或理解問題的根源,而是您只是通過授予非常廣泛的權限集(這裡的顯式GRANT
取代隱式 拒絕優先性質)來迴避它。除此之外,我不確定您的根本問題實際上是什麼,但我建議您首先撤消(不授予)
DENY
您映射到TestWriter
角色的所有顯式權限,然後開始測試您的Test
使用者有權訪問的內容.