Sql-Server-2014

表上的 INSERT 被拒絕。但登錄有權限

  • October 4, 2021

我正在執行從數據庫 X 到數據庫 Y 的過程。

在數據庫 Y 上應該有來自使用者的插入。

在此處輸入圖像描述

在這張圖片中,第一列是登錄名,第二列是擁有所有必要權限的角色(它在我們需要的表上有 INSERT)。

登錄名已正確分配給角色,並且該角色具有所有必要的權限。

但是當我執行該過程時,我收到了那些著名的錯誤:

Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 165 [Batch Start Line 2]
The INSERT permission was denied on the object 'XXXXXXXXXXX', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 484 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 527 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.
Msg 229, Level 14, State 5, Procedure PROCEDURENAME, Line 570 [Batch Start Line 2]
The INSERT permission was denied on the object 'YYYYYYYYYYYYYY', database 'DB', schema 'dbo'.

我創建了另一個測試登錄,提供了完全相同的權限並且它工作。

如何找到阻止此登錄的插入的內容?我什至跑了一個跟踪,看看我是否能找到更多的錯誤,在 eventviewer 上也沒有。

登錄沒有明確的權限。它只是具有權限的角色的成員身份。

角色權限正確:

在此處輸入圖像描述

編輯:

自從重新創建 Windows 登錄並重做所有權限以來,我嘗試了一切。我注意到的是:

我可以創建一個登錄名(使用密碼的 sql 登錄名)並且它有效。

我嘗試使用原始 Windows 登錄名在表中插入數據,但失敗了,然後我將其從 ROLE 中刪除並授予它 INSERT 權限,但它仍然失敗。即使對數據庫具有插入權限,它也無法插入數據。

如果問題出在 Windows 登錄,使用 SQL Server 登錄進行測試將無濟於事。這是因為 Windows 登錄能夠通過多個來源(本身和/或一個或多個 Windows 組)進行身份驗證。

Windows 登錄如何進行身份驗證?

  • 直接(即登錄有一個條目sys.sys.server_principals),
  • 通過一個或多個 Windows / AD 組(登錄在 中沒有條目sys.server_principals,但是一個或多個在 中有條目的組的成員sys.server_principals),
  • 或兩者?

對於 Windows 登錄,將查看所有可能的身份驗證方式中的所有GRANTs 和s。DENY即使在 SQL Server 中為此 Windows 登錄創建了顯式登錄,也不會取消或優先於與它們所屬的任何 Windows 組關聯的任何權限,這些權限也被列為登錄。可能是一個或多個 Windows / AD 組中的成員具有某種DENY或其他限制,並且這些限制優先於GRANTs。NET USER {login}通過命令提示符列出組。

OP 回复:

使用EXEC xp_logininfo 'DOMAIN\LOGIN','all';我可以找到Permission path指向一個帶有 DENY 的組。!!!

這並不能消除問題,但它確實確定了問題的原因,因此現在有望得到解決。

一種可能的解決方案是使用模組簽名(連結到我的資訊站點),儘管我必須進行測試以查看它如何處理DENY優先級的 a 。無論哪種方式,您都不需要弄亂角色和對對象的直接權限,因此即使遇到由DENY.

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