昨天晚上进行了数据库迁移,完成后发现与第三方软件做接口时提供的只读账户不见了。查了各种资料,终于找到了官方文档(链接放在文尾)。
首先可以用exec sp_change_users_login 'REPORT' 来查看有哪些未指定数据库实例的用户(即像我这样换了服务器后还原出来的数据库实例里边没有了以前创建的指定权限的登录名(被孤立的账户))
Report :列出当前数据库中未链接到任何登录名(我理解为数据库实例名)的用户和相应的安全标识符(SID)。用户,不用指定登录名和密码。
要用使用系统表的查询代替报表选项,请将sys.server_prinicpals中的条目与sys.database_principals中的条目进行比较。
Auto_Fix :在当前数据库的sys.database_principals系统目录视图中,将一个用户条目与同名的SQL Server登录名相印证。如果不存在同名的登录名,则会创建一个。
检查 Auto_Fix 语句的结果,以确认是否真的建立了正确的链接。避免在安全敏感的情况下使用 Auto_Fix。
当你使用Auto_Fix时,如果登录不存在,你必须指定用户和密码,否则你必须指定用户,但密码将被忽略。login不能有其他用户映射到它。
下面的例子显示了如何使用将现有用户映射到同名的登录名,或者在登录名不存在的情况下创建具有密码的SQL Server登录名.Auto_Fix yh wxl.1989。
注意! 此处必须使用强密码! 否则报错~~
EXEC sp_change_users_login 'Auto_Fix', 'yh', NULL, 'wxl.1989';
我个人推荐使用通过Auto_Fix 方法 添加新的登录名并更新用户,来修复孤立的用户。
Update_One:将当前数据库中的指定用户链接到现有的SQL Server登录名上。必须指定用户和登录名。密码必须为NULL或未指定。
在下面的例子中,一个数据库用户与一个新的SQL Server登录相关联,数据库用户 ,一开始被映射到另一个登录,被重新映射到登录.BL MaryB。
--------------20211119---'Update_One','BL','MaryB' 'BL 少写了一个单引号 因再次用到,特来修改
--Create the new login.创建新的登录名
CREATE LOGIN MaryB WITH PASSWORD = '982734snfdHHkjj3';
GO
--Map database user BL to login MaryB.
--将数据库用户BL映射给登录名MaryB
USE AdventureWorks;
GO
EXEC sp_change_users_login 'Update_One', 'BL', 'MaryB';
GO
特记录此坑!!!
参考文档: