SQL Server执行SP_AddRole创建test角色提示已存在但无对应对象怎么解决
问题根因
创建角色时提示名称冲突但找不到对应角色,是因为master数据库中存在和test同名的其他类型对象(安全主体/架构/普通业务对象等),SQL Server同一数据库内不允许重名的安全主体,同时部分场景下同名的其他类型对象也会触发创建冲突。
解决步骤
- 第一步:排查是否存在同名安全主体
执行查询语句确认是否有同名的用户、应用角色等安全主体:SELECT name, type_desc FROM sys.database_principals WHERE name = 'test'
根据返回的type_desc字段处理:- 若为
SQL_USER/WINDOWS_USER/WINDOWS_GROUP等用户类型:确认该用户无使用需求后,执行DROP USER [test]删除用户 - 若为
APPLICATION_ROLE应用角色:确认无使用需求后,执行DROP APPLICATION ROLE [test]删除应用角色
- 若为
- 第二步:排查是否存在其他类型同名对象
如果第一步未查询到结果,执行如下语句查询所有同名对象:SELECT name, type_desc, SCHEMA_NAME(schema_id) AS belong_schema FROM sys.all_objects WHERE name = 'test'
根据返回结果处理:- 若为
SCHEMA架构类型:先转移或删除该架构下的所有对象,确认无使用需求后执行DROP SCHEMA [test]删除架构 - 若为表、存储过程、视图等普通业务对象:确认无使用需求后执行对应删除语句,例如对象为dbo架构下的表时执行
DROP TABLE [dbo].[test]
- 若为
- 第三步:创建角色
完成上述清理后,使用推荐的标准语法创建角色,避免使用已弃用的sp_addrole存储过程:CREATE ROLE [test] AUTHORIZATION dbo
创建完成后即可正常执行添加成员等操作:ALTER ROLE [test] ADD MEMBER [Domain\userName]
注意事项
- 所有操作需在master数据库上下文下执行,执行前先运行
USE master切换数据库 - 涉及删除对象的操作请提前确认对象无业务依赖,避免误删数据
内容的提问来源于stack exchange,提问作者Trupti J
相关产品推荐
相关产品推荐

