對象“TheTable”、數據庫“TheDb”、模式“dbo”的 INSERT/UPDATE/DELETE 權限被拒絕
我在一個數據庫上有兩個 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 account與Windows 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 不允許對系統目錄進行臨時更新。
我注意到UserA和UserB之間的另一個區別:在 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;
你知道如何追踪這些權限的來源嗎?
正如評論中所建議的,我列出了UserA和UserB
DENY
的權限: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
以下是授予許可後的螢幕截圖。