当前位置: 移动技术网 > IT编程>数据库>MSSQL > MSSQL数据库迁移之用户名问题

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

卢启迪,河图传,遗传学课后习题答案

但是,此时用户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'
......

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网