AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 392604
Accepted
Richard
Richard
Asked: 2012-05-26 03:18:36 +0800 CST2012-05-26 03:18:36 +0800 CST 2012-05-26 03:18:36 +0800 CST

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

  • 772

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

不幸的是,我们想将应用程序指向一个新服务器,并将相关数据库备份并恢复到这个新服务器 - 有没有办法将登录名从一个服务器复制到另一个服务器,保持密码值与以前一样?

sql-server sql
  • 2 2 个回答
  • 158 Views

2 个回答

  • Voted
  1. Best Answer
    MichelZ
    2012-05-26T03:43:41+08:002012-05-26T03:43:41+08:00

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

    来自链接的相关内容:

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

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

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

    要将登录名和密码从服务器 A 上的 SQL Server 实例传输到服务器 B 上的 SQL Server 实例,请执行以下步骤: 在服务器 A 上,启动 SQL Server Management Studio,然后从你移动了数据库。打开一个新的查询编辑器窗口,然后运行以下脚本。如果 OBJECT_ID ('sp_hexadecimal') 不为空,则使用 master GO
    DROP PROCEDURE sp_hexadecimal GO CREATE PROCEDURE sp_hexadecimal @binvalue varbinary(256), @hexvalue varchar (514) 输出为 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) 选择@i = @i + 1 结束

    选择@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 @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游标

      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 '未找到登录。CLOSE login_curs DEALLOCATE login_curs RETURN -1 END SET @tmpstr = '/* sp_help_revlogin 脚本' PRINT @tmpstr SET @tmpstr = '** 生成' + 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 -- 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 + ',
    

    默认数据库 = [' + @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 数据库中创建两个存储过程。这两个存储过程分别命名为 sp_hexadecimal 存储过程和 sp_help_revlogin 存储过程。运行以下语句。EXEC sp_help_revlogin sp_help_revlogin 存储过程生成的输出脚本是登录脚本。此登录脚本创建具有原始安全标识符 (SID) 和原始密码的登录。在服务器 B 上,启动 SQL Server Management Studio,然后连接到将数据库移动到的 SQL Server 实例。

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

    • 2
  2. joeqwerty
    2012-05-26T07:58:05+08:002012-05-26T07:58:05+08:00

    更好的解决方案是更改密码,然后重新配置应用程序以使用新密码。您声明您无法从应用程序中恢复密码,但这是否也意味着您无法重新配置应用程序以使用其他密码?如果您需要迁移应用程序怎么办?

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

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

    • 1

相关问题

  • sql server 连接字符串上的网络数据包大小以提高吞吐量

  • 基于 Microsoft 的服务器(IIS、MSSQL 等)上的病毒扫描应排除哪些内容?

  • SQL 洗衣清单

  • OPENROWSET、二进制文件、varchars 和 varbinaries

  • 聚集索引与非聚集索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve