在数据库管理中,备份或恢复数据库是一个常见的操作场景。但有时在成功恢复数据库的新版本后,可能需要删除当前的用户。虽然直接在用户节点上删除用户看似是一个简单的操作,但可能会遇到错误,例如:
Msg 15421, Level 16, State 1, Line 1
数据库主体拥有数据库角色,无法删除。
面对这样的问题,应该如何操作呢?
微软的SQL Server提供了多种方法来维护数据库的安全性。本文不讨论SQL Server的安全性,而是专注于如何解决以下问题:
数据库主体拥有数据库角色,无法删除。
数据库主体拥有模式,无法删除。
本文将分为两个部分进行讨论。在第一部分,将讨论如何找出用户所在的角色列表;在第二部分,将讨论如何解决这个问题。
在这部分,主要目标是找出目标数据库中现有的角色列表。为此,可以使用一个简单的Transact-SQL查询,通过SQL Server的
SYS.DATABASE_PRINCIPALS
表来实现。以下是示例SQL脚本和所需的步骤:
打开SQL Server Management Studio,并以管理员用户身份登录。 选择数据库,设置用户名,并执行以下Transact-SQL查询以获取数据库角色和用户详细信息。
SELECT
DBPRINCIPAL_1.NAME AS ROLE,
DBPRINCIPAL_1.NAME AS OWNER
FROM
SYS.DATABASE_PRINCIPALS AS DBPRINCIPAL_1
INNER JOIN
SYS.DATABASE_PRINCIPALS AS DBPRINCIPAL_2
ON
DBPRINCIPAL_1.PRINCIPAL_ID = DBPRINCIPAL_2.OWNING_PRINCIPAL_ID
WHERE
(DBPRINCIPAL_1.NAME = 'User Name To Remove')
上述Transact-SQL查询将返回用户所在的角色列表。
关于
SYS.DATABASE_PRINCIPALS
表的更多信息可以在
中找到。
这部分的任务是在第一部分的基础上,删除指定的用户。以下是需要遵循的步骤:
首先,在对象资源管理器中展开“数据库”节点。 选择目标数据库,然后依次进入“安全性”->“角色”->“数据库角色”。 双击上述SQL命令输出中列出的条目。 将“所有者”更改为某个临时用户名。 如果对话框中出现了您想要删除的用户名,请选择并将其从那里删除。 (对于上述SQL查询中出现的每个角色,都执行此操作。)
导航到“数据库”->目标数据库->“安全性”->“模式”。 双击打开“db_owner”并将模式所有者更改为dbo。
然后转到:数据库->目标数据库->“安全性”->“用户”。 右键单击您想要删除的用户名,然后点击“删除”,在新出现的对话框中点击“确定”。
注意:在完成上述步骤(除了第二部分第4步)之后,您也可以尝试使用存储过程
sp_dropuser
来删除用户。
EXEC sp_dropuser 'User name'