Recientemente escribí un post que habla de cómo transferir los Logins entre instancias de SQL Server utilizando scripts documentados en la base de conocimiento de Microsoft. Pueden encontrar este post en:
Cómo transferir los inicios de sesión y las contraseñas entre instancias de SQL Server
Además de transferir la contraseña, normalmente queremos que el nuevo Login tenga el mismo SID para evitar que los usuarios queden huérfanos dentro de las bases de datos migradas o transferidas. Esto lo realizan los script documentados en la base de conocimiento que hago referencia en el post.
Sin embargo uno de los lectores me hizo notar que no había explicado que los scripts generados por estos documentos no generan los scripts correspondientes a los roles (funciones) de servidor que tenían en la instancia de origen. Solo el método 2 del documento en inglés que transfiere los Logins desde el SQL Server 2000 al SQL Server 2005/2008 tiene la posibilidad de generar el script para transferir los roles de servidor entre las instancias. Las otras versiones del script no lo hacen.
Si ya hemos creado los Login con el script de estos documentos de la base de conocimiento y debemos además, transferir los roles de servidor a esta nueva instancia, y nuestro origen es un SQL Server 2005 o un SQL Server 2008, podemos usar el siguiente script para generar el script de transferencia:
-- Genera el script con los Roles para los Logins
Select
'exec master.dbo.sp_addsrvrolemember @loginame='''
+ sp.name + ''', @rolename='''+sp2.name +''';'
from
master.sys.server_principals as sp
join master.sys.server_role_members as srm
on sp.principal_id = srm.member_principal_id
join master.sys.server_principals as sp2
on srm.role_principal_id=sp2.principal_id
where sp.type in ('S','U','G')
-- Genera el script con la base de datos por default (omision) para los Logins
Select
'ALTER LOGIN ['+ sp.name
+'] WITH DEFAULT_DATABASE = ['
+ sp.default_database_name +'];'
from
master.sys.server_principals as sp
where sp.type in ('S','U','G')
and sp.default_database_name is not null