Cómo transferir inicios de sesión y contraseñas entre servidores SQL Server

Seleccione idioma Seleccione idioma
Id. de artículo: 246133 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E246133
Expandir todo | Contraer todo

En esta página

Resumen

Cuando se mueven bases de datos a un nuevo servidor, es posible que los usuarios no puedan iniciar sesión en él. En su lugar, reciben el siguiente mensaje de error:
Msj 18456, Nivel 16, Estado 1
Error de inicio de sesión del usuario '%ls'.
Es necesario transferir los inicios de sesión y las contraseñas al nuevo servidor. En este artículo se describe cómo transferir los inicios de sesión y las contraseñas a un nuevo servidor.

Transferir inicios de sesión y contraseñas entre servidores que ejecutan SQL Server 7.0

La característica Transferencia de objetos de los Servicios de transformación de datos (DTS) de SQL Server 7.0 transfiere los inicios de sesión y los usuarios entre dos servidores, pero no transfiere las contraseñas para los inicios de sesión autenticados de SQL Server. Para transferir inicios de sesión y contraseñas de un servidor que está ejecutando SQL Server 7.0 a otro que esté ejecutando SQL Server 7.0, siga los pasos de la sección "Una solución completa para transferir inicios de sesión y contraseñas entre las diferentes versiones de SQL Server".

Transferir inicios de sesión y contraseñas desde SQL Server 7.0 a SQL Server 2000 o entre servidores que ejecutan SQL Server 2000

Para transferir inicios de sesión y contraseñas desde un servidor SQL Server 7.0 a una instancia de SQL Server 2000, o entre dos instancias de SQL Server 2000, puede utilizar la nueva tarea de transferencia de inicios de sesión del paquete DTS de SQL Server 2000. Para ello, siga estos pasos:
  1. Conéctese al servidor SQL Server 2000 de destino, vaya a los Servicios de transformación de datos del Administrador corporativo de SQL Server, expanda la carpeta, haga clic con el botón secundario del mouse en Paquetes locales y, a continuación, haga clic en Nuevo Paquete.
  2. Una vez abierto el diseñador de paquetes DTS, haga clic en Tarea de transferencia de inicios de sesión en el menú Tarea. Complete la información de las fichas Origen, Destino e Inicios de sesión, según corresponda.

    Importante El servidor SQL Server 2000 de destino no puede ejecutar la versión de 64 bits de SQL Server 2000. Los componentes DTS para la versión de 64 bits de SQL Server 2000 no están disponibles. Si está importando inicios de sesión desde una instancia de SQL Server que está en un equipo distinto, su sesión de SQL Server deberá ejecutarse en una cuenta de dominio para completar la tarea.

    Nota: el método DTS transferirá las contraseñas pero no el SID original. Si un inicio de sesión no se crea con el SID original y las bases de datos de usuario también se transfieren a un servidor nuevo, los usuarios de las bases de datos quedarán "huérfanos" de los inicios de sesión. Para transferir el SID original y omitir a los usuarios huérfanos, siga los pasos de "Una solución completa para transferir inicios de sesión y contraseñas entre las diferentes versiones de SQL Server".

Transferir inicios de sesión y contraseñas entre sesiones de SQL Server 2005

Para obtener más información acerca de cómo transferir los inicios de sesión y contraseñas entre instancias de SQL Server 2005, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
918992 Cómo transferir inicios de sesión y contraseñas entre servidores SQL Server 2005

Una solución completa para transferir inicios de sesión y contraseñas entre las diferentes versiones de SQL Server

Este método se aplica en los escenarios siguientes:
  • Transfiere inicios de sesión y contraseñas de SQL Server 7.0 a SQL Server 7.0.
  • Transfiere inicios de sesión y contraseñas de SQL Server 7.0 a SQL Server 2000.
  • Transfiere inicios de sesión y contraseñas de SQL Server 7.0 a SQL Server 2005.
  • Transfiere inicios de sesión y contraseñas entre servidores que ejecutan SQL Server 2000.
  • Transfiere inicios de sesión y contraseñas de SQL Server 2000 a SQL Server 2005.
Nota: examine los comentarios al final de este artículo para conocer la información importante acerca de los pasos siguientes.

Para transferir inicios de sesión y contraseñas entre las diferentes versiones de SQL Server, siga estos pasos:
  1. Ejecute la siguiente secuencia de comandos en el origen de SQL Server. Esta secuencia de comandos crea dos procedimientos almacenados denominados sp_hexadecimal y sp_help_revlogin en la base de datos master. Continúe con el paso 2 cuando termine de crear el procedimiento.

    Nota: el siguiente procedimiento depende de las tablas de sistema de SQL Server. La estructura de estas tablas puede variar de una versión de SQL Server a otra y no se recomienda realizar la selección directamente desde las tablas de sistema.
    ----- Begin Script, Create sp_help_revlogin procedure -----
    
    USE master
    GO
    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal
        @binvalue varbinary(256),
        @hexvalue varchar(256) OUTPUT
    AS
    DECLARE @charvalue varchar(256)
    DECLARE @i int
    DECLARE @length int
    DECLARE @hexstring char(16)
    SELECT @charvalue = '0x'
    SELECT @i = 1
    SELECT @length = DATALENGTH (@binvalue)
    SELECT @hexstring = '0123456789ABCDEF' 
    WHILE (@i <= @length) 
    BEGIN
      DECLARE @tempint int
      DECLARE @firstint int
      DECLARE @secondint int
      SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
      SELECT @firstint = FLOOR(@tempint/16)
      SELECT @secondint = @tempint - (@firstint*16)
      SELECT @charvalue = @charvalue +
        SUBSTRING(@hexstring, @firstint+1, 1) +
        SUBSTRING(@hexstring, @secondint+1, 1)
      SELECT @i = @i + 1
    END
    SELECT @hexvalue = @charvalue
    GO
    
    IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
      DROP PROCEDURE sp_help_revlogin 
    GO
    CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
    DECLARE @name    sysname
    DECLARE @xstatus int
    DECLARE @binpwd  varbinary (256)
    DECLARE @txtpwd  sysname
    DECLARE @tmpstr  varchar (256)
    DECLARE @SID_varbinary varbinary(85)
    DECLARE @SID_string varchar(256)
    
    IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name = @login_name
    OPEN login_curs 
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
    IF (@@fetch_status = -1)
    BEGIN
      PRINT 'No login(s) found.'
      CLOSE login_curs 
      DEALLOCATE login_curs 
      RETURN -1
    END
    SET @tmpstr = '/* sp_help_revlogin script ' 
    PRINT @tmpstr
    SET @tmpstr = '** Generated ' 
      + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
    PRINT @tmpstr
    PRINT ''
    PRINT 'DECLARE @pwd sysname'
    WHILE (@@fetch_status <> -1)
    BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
        PRINT ''
        SET @tmpstr = '-- Login: ' + @name
        PRINT @tmpstr 
        IF (@xstatus & 4) = 4
        BEGIN -- NT authenticated account/group
          IF (@xstatus & 1) = 1
          BEGIN -- NT login is denied access
            SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
            PRINT @tmpstr 
          END
          ELSE BEGIN -- NT login has access
            SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
            PRINT @tmpstr 
          END
        END
        ELSE BEGIN -- SQL Server authentication
          IF (@binpwd IS NOT NULL)
          BEGIN -- Non-null password
            EXEC sp_hexadecimal @binpwd, @txtpwd OUT
            IF (@xstatus & 2048) = 2048
              SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
            ELSE
              SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
            PRINT @tmpstr
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
          END
          ELSE BEGIN 
            -- Null password
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
          END
          IF (@xstatus & 2048) = 2048
            -- login upgraded from 6.5
            SET @tmpstr = @tmpstr + '''skip_encryption_old''' 
          ELSE 
            SET @tmpstr = @tmpstr + '''skip_encryption'''
          PRINT @tmpstr 
        END
      END
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
      END
    CLOSE login_curs 
    DEALLOCATE login_curs 
    RETURN 0
    GO
     ----- End Script -----
    
    
  2. Una vez creado el procedimiento almacenado sp_help_revlogin, ejecute este procedimiento desde el Analizador de consultas del servidor de origen. El procedimiento almacenado sp_help_revloginse puede utilizar tanto en SQL Server 7.0 como en SQL Server 2000. El resultado de este procedimiento almacenado son secuencias de comandos de inicio de sesión que crean inicios de sesión con el SID y las contraseñas originales. Guarde el resultado y, a continuación, péguelo y ejecútelo en el Analizador de consultas del servidor SQL Server de destino. Por ejemplo:
    EXEC master..sp_help_revlogin
    

Comentarios

  • Revise cuidadosamente la secuencia de comandos del resultado antes de ejecutarla en el servidor SQL Server de destino. Si necesita transferir inicios de sesión a una instancia de SQL Server que se encuentre en un dominio que la instancia de origen de SQL Server, modifique la secuencia de comandos generada por el procedimiento sp_help_revlogin y reemplace el nombre de dominio por el nuevo dominio en las instrucciones sp_grantlogin. Dado que los inicios de sesión integrados a los que se concedió acceso en el nuevo dominio no tendrán el mismo SID que los inicios de sesión del dominio original, los usuarios de la base de datos quedarán huérfanos de estos inicios de sesión. Para resolver este problema, consulte los artículos a los que se hace referencia en la siguiente viñeta. Si transfiere inicios de sesión integrados entre dos instancias de SQL Server del mismo dominio, se utilizará el mismo SID y probablemente el usuario no quedará huérfano.
  • Después de mover los inicios de sesión, es posible que los usuarios no tengan permiso para obtener acceso a las bases de datos que también se han movido. Este problema se describe como "usuario huérfano". Si intenta conceder acceso de inicio de sesión a la base de datos, se producirá un error que indique que el usuario ya existe:
    Microsoft SQL-DMO (ODBC SQLState: 42000) Error 15023: El usuario o función '%s' ya existen en la base de datos actual.
    Para obtener instrucciones acerca de cómo asignar los inicios de sesión a los usuarios de la base de datos a fin de resolver los inicios de sesión huérfanos e integrados de SQL Server, consulte el artículo siguiente:
    240872Cómo resolver problemas de permisos cuando se traslada una base de datos entre servidores SQL Server
    Para obtener instrucciones acerca de cómo utilizar el procedimiento almacenado sp_change_users_login para corregir los usuarios huérfanos uno por uno (sólo afecta a usuarios huérfanos de inicios de sesión estándar de SQL), consulte el artículo siguiente en Microsoft Knowledge Base:
    274188 El tema "Solución de problemas de usuarios huérfanos" de Libros en pantalla está incompleto
  • Si la transferencia de inicios de sesión y contraseñas es parte de un movimiento de bases de datos a un nuevo servidor que ejecuta SQL Server, consulte el artículo siguiente en Microsoft Knowledge Base para obtener una descripción del flujo de trabajo y los pasos necesarios:
    314546 Cómo mover bases de datos entre equipos que están ejecutando SQL Server
  • Esto es posible gracias al parámetro @encryptopt del procedimiento almacenado del sistema sp_addlogin, que permite crear un inicio de sesión mediante la contraseña cifrada. Para obtener más información acerca de este procedimiento, vea el tema "sp_addlogin (T-SQL)" en los Libros en pantalla de SQL Server.
  • De manera predeterminada, sólo los miembros de la función fija de servidor sysadmin pueden realizar la selección en la tabla sysxlogins. A menos que un miembro de la función sysadmin conceda los permisos necesarios, los usuarios finales no pueden crear o ejecutar estos procedimientos almacenados.
  • Esta solución no intenta transferir la información de la base de datos predeterminada para un inicio de sesión específico, ya que ésta no siempre se encuentra en el servidor de destino. Para definir la base de datos predeterminada para un inicio de sesión, puede utilizar el procedimiento almacenado del sistema sp_defaultdb y pasarle como argumentos el nombre de inicio de sesión y la base de datos predeterminada. Para obtener más información acerca de cómo utilizar este procedimiento, vea el tema "sp_defaultdb" en los Libros en pantalla de SQL Server.
  • Durante la transferencia de inicios de sesión entre instancias de SQL Server, si en el orden del servidor de origen no se distinguen mayúsculas y minúsculas, y en el orden del servidor de destino sí se distinguen, debe escribir en mayúscula todos los caracteres alfabéticos de las contraseñas después de la transferencia de los inicios de sesión al servidor de destino. Si en el orden de las columnas del servidor de origen se distinguen mayúsculas y minúsculas, y en el del servidor de destino no, no podrá iniciar sesión con los inicios de sesión que se transfieran utilizando el procedimiento descrito en este artículo a menos que la contraseña original no contenga ningún carácter alfabético o que todos sus caracteres estén en mayúsculas. Si en los dos servidores se distinguen mayúsculas y minúsculas, o no se distinguen en ninguno de ellos, no tendrá ningún problema. Éste es un efecto secundario de la forma en que SQL Server trata las contraseñas. Para obtener más información, vea el tema que trata el efecto en las contraseñas del cambio del orden ("Effect on Passwords of Changing Sort Orders") de los Libros en pantalla de SQL Server 7.0.
  • Cuando ejecuta el resultado de la secuencia de comandos sp_help_revlogin en un servidor de destino, si éste ya tiene definido un inicio de sesión con el mismo nombre que uno de los inicios de sesión del resultado de la secuencia de comandos, puede ver el error siguiente:
    Servidor: Msj 15025, Nivel 16, Estado 1, Procedimiento sp_addlogin, Línea 56
    El inicio de sesión 'prueba1' ya existe.
    Del mismo modo, si existe un inicio de sesión diferente con el mismo valor de SID en este servidor que el que está intentando agregar, aparecerá el siguiente error:
    Servidor: Msj 15433, Nivel 16, Estado 1, Procedimiento sp_addlogin, Línea 93
    El parámetro @sid especificado está en uso.
    Por lo tanto, debe revisar cuidadosamente el resultado de estos comandos, examinar el contenido de la tabla sysxloginsy tratar estos errores convenientemente.
  • El valor del SID de un inicio de sesión determinado se utiliza como base para implementar el acceso de nivel de base de datos en SQL Server. Por consiguiente, si el mismo inicio de sesión tiene dos valores diferentes para SID en el nivel de base de datos (en dos bases de datos diferentes de ese servidor), el inicio de sesión sólo tendrá acceso a la base de datos cuyo SID coincida con el valor de syslogins para ese inicio de sesión. Esta situación podría producirse si las dos bases de datos en cuestión se hubieran consolidado desde dos servidores diferentes. Para resolver este problema, el inicio de sesión se debería quitar manualmente de la base de datos cuyo SID no coincide mediante el procedimiento almacenado sp_dropuser y se tendría que volver a agregar de nuevo con el procedimiento almacenado sp_adduser.

Propiedades

Id. de artículo: 246133 - Última revisión: viernes, 23 de marzo de 2007 - Versión: 6.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000, Workgroup Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
Palabras clave: 
kbhowtomaster kbinfo KB246133

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com