Permissions

如果 CONTROL 被拒絕,則使用者在具有 SELECT 權限時無法從表中選擇

  • April 5, 2021

我正在 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 使用者有權訪問的內容.

引用自:https://dba.stackexchange.com/questions/289290