使用以下方法将单个孤立的SQL用户固定为登录名是相当简单的:
EXEC sp_change_users_login'自动修复','用户'
我可以编写脚本,但是是否存在现有的存储过程,该存储过程会自动尝试修复给定数据库中的每个孤立用户?
使用以下方法将单个孤立的SQL用户固定为登录名是相当简单的:
EXEC sp_change_users_login'自动修复','用户'
我可以编写脚本,但是是否存在现有的存储过程,该存储过程会自动尝试修复给定数据库中的每个孤立用户?
Answers:
泰德·克鲁格(Ted Krueger)(在Twitter上@onpnt)编写了一个出色的脚本来完成此任务。它为没有登录名的任何用户添加登录名并运行auto_fix。他甚至写了一篇包括修复Windows登录名的文章:
http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/fixing-orphaned-database-users
当然,如果您想先对其进行测试(或仅执行审核),则可以注释掉操作行(EXEC
),然后仅打印结果。
以下是可以完美完成工作的简单脚本-
USE DBNAME ----- change db name for which you waant to fix orphan users issue
GO
declare @name varchar(150)
DECLARE cur CURSOR FOR
select name from master..syslogins
Open cur
FETCH NEXT FROM cur into @name
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_change_users_login 'AUTO_FIX', @name
FETCH NEXT FROM cur into @name
END
CLOSE cur
DEALLOCATE cur
基于上述脚本,我们可以使用sp_MSForeachdb这样在一个实例上修复所有用户
declare @name varchar(150)
declare @query nvarchar (500)
DECLARE cur CURSOR FOR
select name from master..syslogins
Open cur
FETCH NEXT FROM cur into @name
WHILE @@FETCH_STATUS = 0
BEGIN
set @query='USE [?]
IF ''?'' <> ''master'' AND ''?'' <> ''model'' AND ''?'' <> ''msdb'' AND ''?'' <> ''tempdb''
BEGIN
exec sp_change_users_login ''Auto_Fix'', '''+ @name +'''
END'
EXEC master..sp_MSForeachdb @query
FETCH NEXT FROM cur into @name
END
CLOSE cur
DEALLOCATE cur
希望对你有帮助
这对于使用dbatools命令Repair-DbaDbOrphanUser是一个很好的用例
首先,您可以识别孤立用户
Get-DbaDbOrphanUser -SqlInstance $sqlinstance
ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance : SQL01
DatabaseName : SockFactoryApp
User : SockFactoryApp_User
然后用解决
Repair-DbaDbOrphanUser -SqlInstance $sqlinstance
ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance : SQL01
DatabaseName : SockFactoryApp
User : SockFactoryApp_User
Status : Success