当将表添加为UI中的安全表时,我试图通过使用“拒绝”和“撤消”sql命令,并选中“拒绝”框来删除数据库中大多数用户的删除权限。
当我这样做时,用户现在无法从数据库中的任何表中进行选择。它们在UI中为所有表授予select权限,包括我试图撤销delete权限的表。
我试图在数据库的备份副本上重新创建所做的工作,但未能拒绝在表上进行选择。
我在任何用户上找到的唯一拒绝权限是拒绝对所有对象进行删除,并在我试图阻止删除的一个表上拒绝。
我没有在任何用户或角色上找到任何拒绝选择。
没有用户是db_denydatareader角色的一部分。
找出为什么用户无法从原始数据库中的任何表中进行选择的最佳方法是什么?
我正在使用Server 2008。
发布于 2016-05-13 02:37:30
我将检查用户是否是db_denydatareader角色的一部分,检查表模式上的拒绝权限,以及公共角色的拒绝权限。我怀疑这是最有可能的罪魁祸首。
发布于 2016-05-13 12:01:36
尝试在数据库中运行此操作--它将在三个单独的结果窗口中为您提供服务器、数据库、对象的权限级别--然后您可以考虑用户的组成员身份与权限级别(将结果复制/粘贴到Excel以便于筛选等)。不是我的代码,而是非常有用的--我会参考原来的帖子/海报,但找不到/记不起来!):
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
复制相似问题