Sql-Server

使用者無法從表中選擇,但他們的權限似乎表明他們應該能夠

  • May 13, 2016

我嘗試通過使用拒絕和撤消 sql 命令撤消數據庫中大多數使用者的刪除權限,並在 UI 中將表添加為安全對象時選中刪除拒絕框。

當我這樣做時,使用者現在無法從數據庫中的任何表中進行選擇。他們在 UI 中為所有表授予了選擇權限,包括我試圖撤銷刪除權限的表。

我試圖重新創建我在數據庫的備份副本上所做的事情,但我無法拒絕對錶進行選擇。

我在任何使用者上發現的唯一拒絕權限是拒絕刪除所有對象並拒絕我試圖阻止刪除的一個表。

我沒有在任何使用者或角色上找到任何拒絕選擇。

沒有使用者屬於db_denydatareader角色。

找出使用者無法從原始數據庫中的任何表中進行選擇的最佳方法是什麼?

我正在使用 SQL Server 2008。

我會檢查使用者是否屬於 db_denydatareader 角色,檢查表架構的拒絕權限,以及公共角色的拒絕權限。我懷疑這些是最有可能的罪魁禍首。

嘗試在數據庫中執行它 - 它會在 3 個單獨的結果視窗中為您提供 SERVER、DATABASE、OBJECT 的權限級別 - 然後您可以考慮使用者的組成員身份與權限級別(將結果複製/粘貼到 Excel 中更容易過濾等(PS。不是我的程式碼,但非常有用 - 我會參考原始文章/海報,但找不到/記住!)):

SELECT a.name as LoginName,a.type_desc AS LoginType, a.default_database_name AS DefaultDBName,
CASE WHEN b.sysadmin = 1 THEN 'sysadmin'
         WHEN b.securityadmin=1 THEN 'securityadmin'
         WHEN b.serveradmin=1 THEN 'serveradmin'
         WHEN b.setupadmin=1 THEN 'setupadmin'
         WHEN b.processadmin=1 THEN 'processadmin'
         WHEN b.diskadmin=1 THEN 'diskadmin'
         WHEN b.dbcreator=1 THEN 'dbcreator'
         WHEN b.bulkadmin=1 THEN 'bulkadmin'
         ELSE 'Public' END AS 'ServerRole'
FROM sys.server_principals a  JOIN master..syslogins b ON a.sid=b.sid WHERE a.type  <> 'R' AND a.name NOT LIKE '##%'


DECLARE @DBuser_sql VARCHAR(4000)
DECLARE @DBuser_table TABLE (DBName VARCHAR(200), UserName VARCHAR(250), LoginType VARCHAR(500), AssociatedRole VARCHAR(200))
SET @DBuser_sql='SELECT ''?'' AS DBName,a.name AS Name,a.type_desc AS LoginType,USER_NAME(b.role_principal_id) AS AssociatedRole FROM [?].sys.database_principals a
LEFT OUTER JOIN [?].sys.database_role_members b ON a.principal_id=b.member_principal_id
WHERE a.sid NOT IN (0x01,0x00) AND a.sid IS NOT NULL AND a.type NOT IN (''C'') AND a.is_fixed_role <> 1 AND a.name NOT LIKE ''##%'' AND ''?'' NOT IN (''master'',''msdb'',''model'',''tempdb'') ORDER BY Name'
INSERT @DBuser_table
EXEC sp_MSforeachdb @command1=@dbuser_sql
SELECT * FROM @DBuser_table ORDER BY DBName

DECLARE @Obj_sql VARCHAR(2000)
DECLARE @Obj_table TABLE (DBName VARCHAR(200), UserName VARCHAR(250), ObjectName VARCHAR(500), Permission VARCHAR(200))
SET @Obj_sql='select ''?'' as DBName,U.name as username, O.name as object,  permission_name as permission from [?].sys.database_permissions
join [?].sys.sysusers U on grantee_principal_id = uid join [?].sys.sysobjects O on major_id = id WHERE ''?'' NOT IN (''master'',''msdb'',''model'',''tempdb'') order by U.name '
INSERT @Obj_table
EXEC sp_msforeachdb @command1=@Obj_sql
SELECT * FROM @Obj_table

希望這會有所幫助,讓我們知道您的進展情況。

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