Sql-Server

對象“TheTable”、數據庫“TheDb”、模式“dbo”的 INSERT/UPDATE/DELETE 權限被拒絕

  • March 12, 2022

我在一個數據庫上有兩個 SQL Server 使用者帳戶,它們在INSERT / UPDATE / DELETE. SQL Server 版本是 2008 R2(10.50.4042,64 位)。

UserA(SQL 登錄):可以執行這些命令(在任何表上)。它是 SQL Server 的“本地”帳戶(SQL Server 登錄,而不是本地伺服器上的 Windows 帳戶)。

UserB(Windows 登錄):不能。它來自 Windows AD 帳戶。它是數據庫伺服器上管理員組的成員。

它得到錯誤:

對象“TheTable”、數據庫“TheDb”、模式“dbo”的 INSERT/UPDATE/DELETE 權限被拒絕

據我所知,這兩個帳戶具有相同的角色。這些角色之一具有對錶的權限INSERT/UPDATE/DELETE

這些帳戶不是角色的成員db_denydatawriter

我試圖明確授予 UserB 的權限:

GRANT SELECT, UPDATE, DELETE, INSERT on TheTable TO [DOMAIN\UserB]

但我仍然有錯誤。

如果我sysadmin在 UserB 上添加角色,當然它有權限。但我不想讓它有這個角色。

所以,對我來說,剩下的唯一區別是local accountWindows AD account

您知道獲得有關潛在 Windows AD 帳戶特定權限的更多資訊的方法嗎?

經過更多研究,我懷疑UserB有一個沒有權限的角色。這個Stack Overflow 的回答讓我走上了正軌。這是一個查詢顯示:

-- Users that are members of roles without any permission :
select *
from sys.database_role_members members 
left outer join sys.database_principals memberprinc on memberprinc.[principal_id] = members.[member_principal_id]
left outer join sys.database_principals roleprinc ON roleprinc.[principal_id] = members.[role_principal_id]
where members.role_principal_id in
(
   -- Roles without any permission :
   select principal_id
   from sys.database_principals roleprinc
   where not exists 
   (
       select * 
       from sys.database_permissions perm 
       where perm.[grantee_principal_id] = roleprinc.[principal_id])
)
and memberprinc.name = 'DOMAIN\UserB'

但我無法編輯這些表(即使具有 sysadmin 角色),這是可以理解的。

Msg 259 不允許對系統目錄進行臨時更新。

我注意到UserAUserB之間的另一個區別:在 TheDb 屬性上,選項卡權限,子選項卡有效:

有效權限

我發現(來自 SQL Server Profiler)這個列表來自以下查詢:

EXECUTE AS LOGIN = N'DOMAIN\UserB';
SELECT 
   permission_name AS [Permission]
FROM fn_my_permissions(N'[TheDb]', N'DATABASE')
ORDER BY permission_name;
REVERT;

你知道如何追踪這些權限的來源嗎?

正如評論中所建議的,我列出了UserAUserBDENY的權限:

SELECT [dp].[name] AS [user_name], [dpr].[name] AS [role_name], [per].[permission_name], [per].[state_desc], OBJECT_NAME([major_id]) AS [object_name]
FROM [sys].[database_principals] AS [dp] 
INNER JOIN [sys].[database_role_members] AS [drm] ON [dp].[principal_id] = [drm].[member_principal_id] 
INNER JOIN [sys].[database_principals] AS [dpr] ON [drm].[role_principal_id] = [dpr].[principal_id] 
INNER JOIN [sys].[database_permissions] AS [per] ON [dpr].[principal_id] = [per].[grantee_principal_id] 
WHERE [dp].[name] in ('DOMAIN\UserB', 'UserA') AND [per].[state_desc] = 'DENY'
ORDER BY [dp].[name];

這兩個使用者對兩個對象具有相同的DENY權限:

user_name role_name permission_name state_desc object_name
---------------------------------------------------------------
UserA RoleC REFERENCES DENY ObjectD
UserA RoleC REFERENCES DENY ObjectE
DOMAIN\UserB RoleC REFERENCES DENY ObjectD
DOMAIN\UserB RoleC REFERENCES DENY ObjectE

有沒有人有更多的線索?

SELECT SUSER_NAME()DOMAIN\UserB我以DOMAIN\UserB.

您必須在目標數據庫中將對像作為安全對象添加給使用者,然後添加必要的安全對象並授予更新權限。

嘗試使用以下腳本。它對我有用。

GRANT SELECT ,UPDATE,DELETE,INSERT ON OBJECT::YourTable  
   TO [Domain\User];  
GO   

我嘗試在 MyLab 數據庫中對使用者 Anoop 授予上述權限。

GRANT SELECT ,UPDATE,DELETE,INSERT ON OBJECT::Account  
   TO [*MyDomain*\anoop];  
GO   

以下是授予許可後的螢幕截圖。

在此處輸入圖像描述

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