Il est assez simple de fixer un seul utilisateur SQL orphelin à une connexion en utilisant:
EXEC sp_change_users_login 'Auto_Fix', 'utilisateur'
Je pourrais écrire ceci, mais existe-t-il une procédure stockée existante qui essaie automatiquement de réparer chaque utilisateur orphelin dans une base de données donnée?
Ted Krueger ( @ onpnt sur Twitter) a écrit un excellent script qui fait cela. Il ajoute des connexions pour tout utilisateur sans connexion et exécute le auto_fix. Il en a même écrit un qui comprend la correction des connexions Windows:
http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/fixing-orphaned-database-users
Bien sûr, si vous voulez le tester d'abord (ou simplement effectuer un audit), vous pouvez commenter les lignes d'action (EXEC
) et simplement imprimer les résultats.
sur la base du script ci-dessus, nous pouvons corriger tous les utilisateurs d'une instance en utilisant sp_MSForeachdb comme ceci
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
j'espère que ça va aider
Voici le script simple qui fait parfaitement le travail -
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
Ce serait un excellent cas d'utilisation pour utiliser la commande dbatools Repair-DbaDbOrphanUser
Vous pouvez d'abord identifier les utilisateurs orphelins
Get-DbaDbOrphanUser -SqlInstance $sqlinstance
ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance : SQL01
DatabaseName : SockFactoryApp
User : SockFactoryApp_User
puis les résoudre avec
Repair-DbaDbOrphanUser -SqlInstance $sqlinstance
ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance : SQL01
DatabaseName : SockFactoryApp
User : SockFactoryApp_User
Status : Success