Existem soluções documentadas para resolver este problema de sincronização de usuários e logins, porém tornam o processo demorado para mapearmos os database_principals com os server_principals, com a procedure sp_change_users_login.
/*
Funcionalidade: Criar script para gerar logins com respectivo password e sid.
Autor: Chad BoydData: 29/01/2007
Adaptado por: Rodrigo Fernandes
Data: 27/04/2007
*/
DECLARE @loginname sysname
SET @loginname = ‘teste_usr’
SELECT ‘create login [‘ + p.name + ‘] ‘ +
CASE WHEN p.type IN(‘U’,’G’)
THEN ‘from windows ‘
ELSE ” END + ‘with ‘ +
CASE WHEN p.type = ‘S’
THEN ‘password = ‘ + master.sys.fn_varbintohexstr(l.password_hash) + ‘ hashed, ‘ + ‘sid = ‘ +
master.sys.fn_varbintohexstr(l.sid) + ‘, check_policy = ‘ +
CASE WHEN
l.is_policy_checked > 0
THEN ‘ON, ‘ ELSE ‘OFF, ‘ END + ‘check_expiration = ‘ +
CASE WHEN l.is_expiration_checked > 0
THEN ‘ON, ‘
ELSE ‘OFF, ‘
END + CASE WHEN l.credential_id > 0
THEN ‘credential = ‘ + c.name + ‘, ‘
ELSE ”
END ELSE ” END + ‘default_database = ‘ + p.default_database_name +
CASE WHEN LEN(p.default_language_name) > 0
THEN ‘, default_language = ‘ + p.default_language_name
ELSE ” END
FROM sys.server_principals p
LEFT JOIN sys.sql_logins l
ON p.principal_id = l.principal_id
LEFT JOIN sys.credentials c
ON l.credential_id = c.credential_id
WHERE p.type in(‘S’,’U’,’G’)
AND p.name <> ‘sa’
AND p.name = @loginname –Opção de filtrar pelo login requerido
Com este script acima podemos gerar um, vários ou todos os usuários para um determinado database ou servidor. Com isto evitamos o trabalho de ao fazermos um Fail Over, mapearmos os usuários para o database.
Espero que este script seja útil a todos! Boa sorte e até a próxima!
Abraços,
Rodrigo Fernandes (RFernandes)

