Existe uma maneira abreviada de 'Auto_Fix' todos os usuários órfãos em um banco de dados SQL Server 2008 R2?

16

É bastante simples corrigir um único usuário órfão do SQL para um logon usando:

EXEC sp_change_users_login 'Correção automática', 'usuário'

Eu poderia escrever isso, mas existe um procedimento armazenado existente que tenta automaticamente corrigir todos os usuários órfãos em um determinado banco de dados?

Daniel James Bryars
fonte

Respostas:

15

Ted Krueger ( @onpnt no twitter) escreveu um ótimo roteiro que faz isso. Ele adiciona logins para qualquer usuário sem login e executa o auto_fix. Ele até escreveu um que inclui a correção de logins do Windows:

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

Obviamente, se você deseja testá-lo primeiro (ou apenas executar uma auditoria), pode comentar as linhas de ação ( EXEC) e apenas imprimir os resultados.

Aaron Bertrand
fonte
2

Abaixo está o script simples que faz o trabalho perfeitamente -

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
fonte
2

com base no script acima, podemos corrigir todos os usuários em uma instância usando sp_MSForeachdb como este

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

espero que ajude

Phú Nguyễn Dương
fonte
bem, i pode explicar que, como este: 1 buscar cada login em syslogins, dois re-mapa utilizador (escopo é o nível de base de dados) e de início de sessão (escopo é nível exemplo) para cada banco de dados
Phú Nguyen Dương
0

Esse seria um ótimo caso de uso para usar o comando dbatools Repair-DbaDbOrphanUser

Primeiro você pode identificar os usuários órfãos

Get-DbaDbOrphanUser -SqlInstance $sqlinstance

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

e depois resolva-os com

Repair-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User
Status       : Success
SQLDBAWithABeard
fonte