Esiste un modo abbreviato per 'Auto_Fix' tutti gli utenti orfani in un database SQL Server 2008 R2?


16

È abbastanza semplice riparare un singolo utente SQL orfano a un login usando:

EXEC sp_change_users_login 'Auto_Fix', 'user'

Potrei scrivere questo script, ma esiste una procedura memorizzata esistente che tenta automaticamente di riparare ogni utente orfano in un determinato database?

Risposte:


15

Ted Krueger ( @onpnt su twitter) ha scritto un ottimo copione che lo fa. Aggiunge accessi per qualsiasi utente senza un login ed esegue auto_fix. Ne ha anche scritto uno che include la correzione degli accessi a Windows:

http://blogs.lessthandot.com/index.php/DataMgmt/DBAdmin/fixing-orphaned-database-users

Ovviamente se si desidera testarlo prima (o semplicemente eseguire un audit) è possibile commentare le righe di azione ( EXEC) e semplicemente stampare i risultati.


2

Di seguito è riportato il semplice script che fa perfettamente il lavoro -

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

2

basandoci sullo script sopra, possiamo correggere tutti gli utenti in un'istanza usando sp_MSForeachdb in questo modo

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

spero che ti sia d'aiuto


bene, posso spiegare che in questo modo: 1 recupera ogni login in syslogins, 2 re-map user (scope è a livello di database) e login (scope è a livello di istanza) per ogni database
Phú Nguyễn Dương

0

Questo sarebbe un ottimo caso d'uso per usare il comando dbatools Repair-DbaDbOrphanUser

Innanzitutto puoi identificare gli utenti orfani

Get-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User

e poi risolverli con

Repair-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User
Status       : Success
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.