¿Hay alguna forma abreviada de 'Auto_Fix' a todos los usuarios huérfanos en una base de datos SQL Server 2008 R2?


16

Es bastante sencillo arreglar un solo usuario SQL huérfano para iniciar sesión usando:

EXEC sp_change_users_login 'Auto_Fix', 'usuario'

Podría escribir esto, pero ¿existe un procedimiento almacenado existente que intente reparar automáticamente a cada usuario huérfano en una base de datos determinada?

Respuestas:


15

Ted Krueger ( @onpnt en twitter) escribió un gran guión que hace esto. Agrega inicios de sesión para cualquier usuario sin inicio de sesión y ejecuta auto_fix. Incluso escribió uno que incluye la reparación de inicios de sesión de Windows:

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

Por supuesto, si desea probarlo primero (o simplemente realizar una auditoría), puede comentar las líneas de acción ( EXEC) e imprimir los resultados.


2

A continuación se muestra el script simple que hace el trabajo perfectamente:

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

De acuerdo con la secuencia de comandos anterior, podemos reparar a todos los usuarios en una instancia 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 ayude


bueno, puedo explicarlo así: 1 busca cada inicio de sesión en syslogins, 2 vuelve a asignar el usuario (el alcance es el nivel de base de datos) y el inicio de sesión (el alcance es el nivel de instancia) para cada base de datos
Phú Nguyễn Dương

0

Este sería un gran caso de uso para usar el comando dbatools Repair-DbaDbOrphanUser

Primero puedes identificar a los usuarios huérfanos

Get-DbaDbOrphanUser -SqlInstance $sqlinstance

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

y luego resolverlos con

Repair-DbaDbOrphanUser -SqlInstance $sqlinstance

ComputerName : SQL01
InstanceName : MSSQLSERVER
SqlInstance  : SQL01
DatabaseName : SockFactoryApp
User         : SockFactoryApp_User
Status       : Success
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.