SQL Server 2005:将帐户从一台服务器移到另一台服务器,同时保持未知的密码

有一个用户帐号,很早以前就有人在我们的数据库服务器上build立了一个用户帐号,没人再知道密码。 但是有些应用程序有密码(由于各种原因,我们无法从应用程序中恢复密码)。

不幸的是,我们希望将这些应用程序指向一个新的服务器,并将相关的数据库备份和恢复到这个新的服务器 – 有没有办法将login从一台服务器复制到另一台服务器,保持密码的价值?

如何在SQL Server 2005和SQL Server 2008的实例之间传输login名和密码

链接相关内容:

在本文中,服务器A和服务器B是不同的服务器。 此外,服务器A和服务器B都运行SQL Server 2005。

注意此信息也适用于SQL Server 2008。

将数据库从服务器A上的SQL Server实例移动到服务器B上的SQL Server实例后,用户可能无法login到服务器B上的数据库。此外,用户可能会收到以下错误消息:用户“MyUser”login失败。 (Microsoft SQL Server,错误:18456)发生此问题是因为您没有将login名和密码从服务器A上的SQL Server实例传输到服务器B上的SQL Server实例。

要将login名和密码从服务器A上的SQL Server实例传输到服务器B上的SQL Server实例,请按照下列步骤操作:在服务器A上,启动SQL Server Management Studio,然后连接到SQL Server实例你移动了数据库。 打开一个新的查询编辑器窗口,然后运行以下脚本。 USE master GO IF OBJECT_ID('sp_hexadecimal')不为NULL
DROP PROCEDURE sp_hexadecimal GO CREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256),@hexvalue varchar(514)OUTPUT AS DECLARE @charvalue varchar(514)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 = @我+ 1结束

SELECT @hexvalue = @charvalue GO IF 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 @type varchar(1)DECLARE @hasaccess int DECLARE @denylogin int DECLARE @IS_disabled int DECLARE @PWD_varbinary varbinary(256)DECLARE @PWD_string varchar(514)DECLARE @SID_varbinary varbinary(85)DECLARE @SID_string varchar(514)DECLARE @tmpstr varchar(1024)DECLARE @is_policy_checked varchar(3)DECLARE @is_expiration_checked varchar 3)

DECLARE @defaultdb sysname IF(@login_name IS NULL)DECLARE login_curs CURSOR FOR

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)WHERE p.type IN('S','G','U')AND p.name <>'sa'ELSE DECLARE login_curs CURSOR FOR

  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)WHERE p.type IN('S','G','U')AND p.name = @login_name OPEN login_curs

FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denylogin IF(@@ fetch_status = -1)BEGIN PRINT'找不到login名'。 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''WHILE(@@ fetch_status <> -1)BEGIN IF(@@ fetch_status <> -2)BEGIN PRINT''SET @tmpstr =' – Login:'+ @name PRINT @tmpstr IF (@type IN('G','U'))BEGIN – NTvalidation的帐户/组

  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'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 END CLOSE login_curs DEALLOCATE login_curs RETURN 0 GO注意此脚本在master数据库中创build两个存储过程。 这两个存储过程被命名为sp_hexadecimal存储过程和sp_help_revlogin存储过程。 运行以下语句。 EXEC sp_help_revlogin由sp_help_revlogin存储过程生成的输出脚本是login脚本。 此login脚本创build具有原始安全标识符(SID)和原始密码的login名。 在服务器B上,启动SQL Server Management Studio,然后连接到移动数据库的SQL Server实例。

重要在进行第5步之前,请查看“备注”一节中的信息。 打开一个新的查询编辑器窗口,然后运行在步骤3中生成的输出脚本。

更好的解决scheme是更改密码,然后重新configuration应用程序以使用新密码。 您表示无法从应用程序中恢复密码,但这是否意味着您无法重新configuration应用程序以使用其他密码? 如果你需要迁移应用程序呢?

不知道密码是一个问题。 在我看来,从组织pipe理的angular度来看,这是站不住脚的,不可接受的。 如果这意味着要做一些工作来重新configuration应用程序来使用新的密码,那么这就是应该发生的事情。

诚然,在短期内,您可以按照MichelZ提供的链接中列出的步骤进行操作,但长期来说,您应该弄清楚如何解决这个问题并加以解决。