请教一下,
在SQL SERVER 2000中,建立了很多数据库,允许远程登录,为每个数据库登录用户创建了一个帐号和密码,请问如何备份这些数据库帐号,以便将来要是数据库出问题了,可以恢复这些帐号和密码,而不需要通知用户?是不是只能在同一台服务器上恢复?

解决方案 »

  1.   

    备份好 master 主数据库。
      

  2.   

    用这个:/*
    在源服务器上执行:EXEC master..sp_help_revlogin test
             将上述输出进行编辑后在目标服务器上执行;
             将源服务器上的用户所属组和权限同步到目标服务器上;
    */----- 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
    GOIF 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,@dbname sysname
    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 a.sid, a.name as name,  a.password as password_hash,b.name as dbname FROM master..sysxlogins  a join master..sysdatabases b on a.dbid=b.dbid
             --select sid,name,password_hash,default_database_name from sys.sql_logins
        WHERE a.name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR 
             --select sid,name,password_hash,default_database_name from sys.sql_logins
    SELECT a.sid, a.name as name,  a.password as password_hash,b.name as dbname FROM master..sysxlogins  a join master..sysdatabases b on a.dbid=b.dbid
        WHERE a.name = @login_name
    OPEN login_curs 
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @binpwd,@dbname
    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 (@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 + ')'          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 + ',@defdb = '''+@dbname+''', @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 + ',@defdb = '''+@dbname+''', @encryptopt = '
          END        SET @tmpstr = @tmpstr + '''skip_encryption'''
          PRINT @tmpstr 
        
      END
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name,  @binpwd,@dbname
      END
    CLOSE login_curs 
    DEALLOCATE login_curs 
    RETURN 0
    GO
     ----- End Script -----