SQL Server 2019执行sp_change_users_login报UTF-8编码无效错误
问题复现场景
在启用UTF8编码支持的SQL Server 2019数据库实例中,尝试执行如下语句:sp_change_users_login 'auto_fix','ELC',NULL,'CLE'
收到系统返回的报错信息:
sp_change_users_login, Line 218 [Batch Start Line 2]
Invalid data for UTF8-encoded characters
The number of orphaned users fixed by updating users was 0.
报错触发原因
- 根本原因是已被微软标记为废弃的
sp_change_users_login存在UTF8兼容缺陷:该存储过程是SQL Server早期版本遗留的兼容逻辑,内部的参数解析、系统元数据校验流程为硬编码实现,完全没有适配SQL Server 2019新增的UTF8编码支持,当实例开启UTF8规则后,存储过程会错误地将符合实例编码规则的元数据判定为无效UTF8字符,直接抛出编码类异常。 - 该异常发生在存储过程的前置校验环节,根本没有进入实际的孤立用户重映射逻辑,所以最终输出“修复的孤立用户数为0”,这个结果不能代表当前库的实际孤立用户状态。
可落地解决方案
- 直接弃用存在兼容问题的
sp_change_users_login,使用SQL Server原生支持、兼容UTF8实例的ALTER USER语法完成重映射,对应上述场景的等效操作语句为:ALTER USER [ELC] WITH LOGIN = [CLE];
该语法的内部字符处理逻辑完全适配开启UTF8的SQL Server 2019环境,不会触发旧存储过程的编码校验bug。 - 如需批量排查当前数据库的孤立用户,直接关联系统视图完成校验,不要调用旧存储过程:
通过sys.database_principals与sys.server_principals的SID匹配关系,筛选出数据库侧存在、但服务器侧无对应关联登录的用户清单后,逐条执行ALTER USER完成重映射即可,全程无额外兼容风险。 - 若执行
ALTER USER时提示找不到对应登录名,需先核对服务器实例上是否真实存在CLE这个SQL登录账号,不要将旧存储过程的编码类报错和实际的账号映射问题混淆。
内容的提问来源于stack exchange,提问作者Jean Valjean
相关产品推荐
相关产品推荐

