如何强制从我的数据库中删除用户?

Cyn*_*ker 1 sql-server delete users sql-server-2016

我正在对我们的开发数据库进行干净的备份,以便轻松地重新启动数据库。该数据库有大约 200 个测试用户,应该将其删除以使其真正干净,但问题是我无法删除其中任何一个。

当我运行如下命令时:

DROP USER [MyGarbageUser]
Run Code Online (Sandbox Code Playgroud)

它提示我以下错误:

消息 15284,级别 16,状态 1,第 5 行 数据库主体已授予或拒绝对数据库中的对象的权限,无法删除。

这些用户既不拥有该数据库中的任何对象(据我所知),也不应该拥有。在网上搜索了一大堆后,我仍然无法找到解决方案。

如何强制从该数据库中删除 MyGarbageUser?

Lea*_*min 5

您尝试删除的用户似乎扮演了授予者的角色,因此您需要在执行用户删除之前撤销这些访问权限。

尝试运行以下命令以首先获取受赠者的详细信息:

select                     
     permission_name,                     
     state_desc,                     
     object_name(major_id) as securable,                     
     user_name(grantor_principal_id) as grantor                     
from sys.database_permissions                     
where grantee_principal_id = user_id('User Name to be dropped')    
Run Code Online (Sandbox Code Playgroud)

接下来将使用以下方法查找授予人的详细信息:

select *                     
from sys.database_permissions                     
where grantor_principal_id = user_id ('User Name to be dropped');     
Run Code Online (Sandbox Code Playgroud)

根据您从上述查询中获得的结果,您需要执行以下操作之一:

REVOKE VIEW DEFINITION ON USER::User Name to be dropped TO public                    
REVOKE CONTROL ON USER::User Name to be dropped TO public                    
REVOKE ALTER ON USER::User Name to be dropped TO public    

REVOKE ALTER ON USER::User Name to be dropped TO *grantee*            
REVOKE CONTROL ON USER::User Name to be dropped TO *grantee*            
REVOKE VIEW DEFINITION ON USER::User Name to be dropped TO *grantee*     
Run Code Online (Sandbox Code Playgroud)

这只是一种可能性,可能有一些其他类型的访问已被授予。因此,您需要检查相同内容并相应地执行撤销。

您可以从以下论坛中找到更多这些示例:

https://ask.sqlservercentral.com/questions/24721/the-database-principal-has-granted-or-denied-permi.html

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/07b40291-6c4d-427e-a5e2-568df482c550/drop-user-fails-with-quotthe-database-principal-has-granted-or-拒绝权限到目录?论坛=sqlsecurity

/sf/ask/2927247431/

以上希望有所帮助。