Existe-t-il un raccourci pour «Auto_Fix» tous les utilisateurs orphelins dans une base de données SQL Server 2008 R2?

16

Il est assez simple de fixer un utilisateur SQL orphelin unique à 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?

Daniel James Bryars
la source

Réponses:

15

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.

Aaron Bertrand
la source
2

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
Devshish
la source
2

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

Phú Nguyễn Dương
la source
eh bien, je peux expliquer que comme ceci: 1 récupérer chaque connexion dans syslogins, 2 re-mapper l'utilisateur (la portée est au niveau de la base de données) et la connexion (la portée est au niveau de l'instance) pour chaque base de données
Phú Nguyễn Dương
0

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
SQLDBAWithABeard
la source