MSSQL数据库迁移之用户名问题

但是,此时用户a存在于数据库a中,而新的mssql中虽然能创建用户a,但无法把权限赋于用户a。新创建一个用户b吧,用户a创建的表和其它信息就又无法访问。在这里找到了解决方法:

在源 sql server 上运行以下脚本。此脚本可在 master 数据库中创建名为 sp_hexadecimal 和 sp_help_revlogin 的两个存储过程。请在完成过程的创建之后继续执行第 2 步。

注意:下面的过程取决于 sql server 系统表。这些表的结构在 sql server 的不同版本之间可能会有变化,请不要直接从系统表中选择。

—– 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. 在创建 sp_help_revlogin 存储过程后,请从源服务器上的查询分析器中运行 sp_help_revlogin 过程。sp_help_revlogin 存储过程可同时用于 sql server 7.0 和 sql server 2000。sp_help_revlogin 存储过程的输出是登录脚本,该脚本可创建带有原始 sid 和密码的登录。保存输出,然后将其粘贴到目标 sql server 上的查询分析器中,并运行它。例如:exec master..sp_help_revlogin


复制代码 代码如下: sp_defaultdb ‘cyiyun’,’db_wayup’

第1步后,在源服务器上运行sp_help_revlogin后,会产生创建用户数据的sql,例如:


复制代码 代码如下:

/* sp_help_revlogin script

** generated 06 24 2009 1:40pm on workgrou-b1xtvc */

declare @pwd sysname

— login: hxtest

set @pwd = convert (varbinary(256), 0x0100cf4e7d342b359438e4bcca72e6c83f44fccf30c8016286de2b359438e4bcca72e6c83f44fccf30c8016286de)

exec master..sp_addlogin ‘520web’, @pwd, @sid = 0x1738bb6ad0cd24498f67fb5589e8edcb, @encryptopt = ‘skip_encryption’

……

把这段直接在新服务器上运行,或者找到相应的用户名创建,就可以解决这个问题了!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐