Como transferir logines entre servidores en SQL Server 2000

Posted on
  • lunes, 29 de septiembre de 2008
  • by
  • Román
  • in
  • 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.
    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
    
    Hugo Román Bernachea
    Mail de contacto: SQLServer777@gmail.com

    Microsoft Certified DBA
    Microsoft Certified Trainer
    Twitter: @bernachea

    0 comentarios:

    Publicar un comentario