Назад | Перейти на главную страницу

SQL Server 2005: перенос учетной записи с одного сервера на другой, сохраняя неизвестный пароль

Существует учетная запись пользователя, которую кто-то давно создал на одном из наших серверов баз данных, пароль для которой никто больше не знает. Однако у некоторых приложений есть пароль (по разным причинам мы не можем восстановить пароль из приложений).

К сожалению, мы хотим направить приложения на новый сервер и сделать резервную копию и восстановить соответствующие базы данных на этом новом сервере - есть ли способ скопировать логин с одного сервера на другой, сохранив значение пароля таким, каким оно было раньше?

Как передавать логины и пароли между экземплярами SQL Server 2005 и SQL Server 2008

Соответствующий контент по ссылке:

В этой статье сервер A и сервер B - это разные серверы. Кроме того, как сервер A, так и сервер B работают под управлением SQL Server 2005.

Примечание. Эта информация также относится к SQL Server 2008.

После перемещения базы данных из экземпляра SQL Server на сервере A в экземпляр SQL Server на сервере B пользователи могут не иметь возможности войти в базу данных на сервере B. Кроме того, пользователи могут получить следующее сообщение об ошибке : Ошибка входа для пользователя MyUser. (Microsoft SQL Server, ошибка: 18456) Эта проблема возникает из-за того, что вы не перенесли логины и пароли из экземпляра SQL Server на сервере A в экземпляр SQL Server на сервере B.

Чтобы передать логины и пароли из экземпляра SQL Server на сервере A в экземпляр SQL Server на сервере B, выполните следующие действия: На сервере A запустите SQL Server Management Studio, а затем подключитесь к экземпляру SQL Server из который вы переместили в базу данных. Откройте новое окно редактора запросов и запустите следующий сценарий. ИСПОЛЬЗУЙТЕ мастер GO, ЕСЛИ OBJECT_ID ('sp_hexadecimal') НЕ ПУСТО
ПРОЦЕДУРА DROP sp_hexadecimal GO CREATE PROCEDURE sp_hexadecimal @binvalue varbinary (256), @hexvalue varchar (514) ВЫВОД КАК DECLARE @charvalue varchar (514) DECLARE @i int DECLARE @length int DECLARE_CARE_CARE_SELARE_CARE_CARE_CARE '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)
ВЫБРАТЬ @secondint = @tempint - (@ firstint * 16) ВЫБРАТЬ @charvalue = @charvalue + SUBSTRING (@hexstring, @ firstint + 1, 1) + SUBSTRING (@hexstring, @ secondint + 1, 1) SELECT @i = @ я + 1 КОНЕЦ

SELECT @hexvalue = @charvalue GO ЕСЛИ OBJECT_ID ('sp_help_revlogin') НЕ ПУСТОЙ ПРОЦЕДУРА УДАЛЕНИЯ sp_help_revlogin GO СОЗДАЙТЕ ПРОЦЕДУРУ sp_help_revlogin @login_name sysname = NULL AS DECLARE @nameEsysname DECLARE @is_disabled int DECLARE @PWD_varbinary varbinary (256) DECLARE @PWD_string varbinary (514) DECLARE @SID_varbinary varbinary (85) DECLARE @SID_string varchar (514) DECLARE @tmpstr_string varchar (514) DECLARE @tmpstrexLARE (@ varchar_) DECLARE @tmpstrexLARE (@ varchar_) 3)

ЗАЯВИТЬ @defaultdb sysname IF (@login_name IS NULL) ЗАЯВИТЬ КУРСОР login_curs ДЛЯ

  SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 

sys.server_principals p LEFT JOIN sys.syslogins l ON (l.name = p.name) ГДЕ p.type IN ('S', 'G', 'U') И p.name <> 'sa' ИНАЧЕ ОБЪЯВЛЯТЬ login_curs КУРСОР ДЛЯ

  SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM 

sys.server_principals p LEFT JOIN sys.syslogins l ON (l.name = p.name) ГДЕ p.type IN ('S', 'G', 'U') AND p.name = @login_name OPEN login_curs

ПОЛУЧИТЬ СЛЕДУЮЩИЙ ИЗ login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin IF (@@ fetch_status = -1) BEGIN PRINT 'Логин (и) не найден.' ЗАКРЫТЬ 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' 'WHILE (@@ fetch_status <> -1) BEGIN IF (@@ fetch_status <> -2) BEGIN PRINT' 'SET @tmpstr =' - Логин: '+ @name PRINT @tmpstr IF (@type IN ('G', 'U')) BEGIN - NT-аутентифицированная учетная запись / группа

  SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
    -- obtain password and sid
        SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
    EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
    EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT

    -- obtain password policy state
    SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name =

@name SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

        SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ',

DEFAULT_DATABASE = ['+ @defaultdb +'] '

    IF ( @is_policy_checked IS NOT NULL )
    BEGIN
      SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
    END
    IF ( @is_expiration_checked IS NOT NULL )
    BEGIN
      SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
    END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
  SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
  SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
  SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr   END

FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin КОНЕЦ ЗАКРЫТЬ login_curs DEALLOCATE login_curs RETURN 0 GO Примечание Этот сценарий создает две хранимые процедуры в базе данных master. Две хранимые процедуры называются хранимой процедурой sp_hexadecimal и хранимой процедурой sp_help_revlogin. Выполните следующую инструкцию. EXEC sp_help_revlogin Выходной сценарий, созданный хранимой процедурой sp_help_revlogin, является сценарием входа в систему. Этот сценарий входа в систему создает логины с исходным идентификатором безопасности (SID) и исходным паролем. На сервере B запустите SQL Server Management Studio, а затем подключитесь к экземпляру SQL Server, на который вы переместили базу данных.

Внимание! Прежде чем перейти к шагу 5, просмотрите информацию в разделе «Примечания». Откройте новое окно редактора запросов, а затем запустите выходной скрипт, созданный на шаге 3.

Лучшим решением было бы изменить пароль, а затем перенастроить приложения для использования нового пароля. Вы заявили, что не можете восстановить пароль из приложений, но означает ли это также, что вы не можете перенастроить приложения для использования другого пароля? Что делать, если вам нужно перенести приложения?

Незнание пароля - проблема. На мой взгляд, это несостоятельно и неприемлемо с организационной и административной точки зрения. Если для этого потребуется выполнить некоторую работу по перенастройке приложений для использования нового пароля, то это должно произойти.

Конечно, в краткосрочной перспективе вы можете выполнить шаги, изложенные в ссылке, предоставленной MichelZ, но в долгосрочной перспективе вы должны выяснить, как решить эту проблему и исправить.