在SQL Server日常维护中,当我们尝试删除某个数据库用户时,有时会收到错误提示:选定的用户拥有对象,所以无法除去该用户。这是因为该用户在所属数据库中仍然持有表、视图、存储过程等对象的所有权,系统为了防止对象变成无主状态而拒绝删除。要解决此问题,必须先将对象转移或删除。

为什么会出现这个提示
SQL Server中的每个数据库对象都有一个所有者。当用户被创建并创建了对象,或者对象的所有权被赋予该用户时,用户就成为了对象的所有者。删除用户前,数据库引擎会检查 sys.objects 等系统视图,如果发现该用户仍拥有对象,就会抛出上述提示。
查询用户拥有的对象
可以通过系统视图快速找出某个用户所拥有的对象名称和类型。将下面语句中的 user_name 替换为实际用户名:
SELECT
o.name AS object_name,
o.type_desc AS object_type,
s.name AS schema_name
FROM sys.objects o
JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'user_name';
此外,该用户可能还拥有架构(schema),也需要一并处理:
SELECT name
FROM sys.schemas
WHERE principal_id = USER_ID('user_name');
转移对象所有权
如果对象仍需保留,应将所有权转给 dbo 或其他合法用户。对于架构,可使用 ALTER AUTHORIZATION:
ALTER AUTHORIZATION ON SCHEMA::user_name TO dbo;
对于具体对象,可使用 ALTER AUTHORIZATION 逐个转移:
ALTER AUTHORIZATION ON OBJECT::dbo.table_name TO dbo;
在早期版本中,也可使用系统存储过程 sp_changeobjectowner:
EXEC sp_changeobjectowner 'user_name.table_name', 'dbo';
删除用户
确认用户不再拥有任何对象和架构后,就可以安全删除了:
DROP USER user_name;
操作建议
- 删除前务必备份数据库,避免误删重要对象。
- 优先使用 ALTER AUTHORIZATION,它是微软推荐的方式。
- 若用户拥有大量对象,可编写脚本批量生成转移语句。
注意:不要直接删除用户拥有的对象,除非明确这些对象已无用,否则会导致业务功能异常。
SQL_Server数据库用户对象所有权修改时间:2026-07-30 22:21:15