在數據庫的維護中最怵的就是移植數據庫了,尤爲是當數據庫中有大量的分工詳細的帳戶,筆者就曾遇到一個服務於web的MSSQL2000數據庫系統,擁有超過200個登陸賬號,與這些賬號相對應的是近百個數據庫。若按照一般移植MSSQL賬號的方法,不只你要記住每個賬號的名稱、密碼,並且你還要記住每一個數據庫中用戶名與每一個登陸賬號的對應關係,我想這個建立賬號的過程必定會讓你抓狂。本文介紹了一種新的思路,即時是忘記了登陸賬號密碼的狀況下也能夠批量移植賬號。
先介紹一下本文中移植賬號的思路及適用範圍:
1. 使用bcp將存儲於源master數據庫中的sysxlogins(存儲登陸賬號)系統表導出;
2. 將導出的文件複製到目標服務器上,再使用bcp將導出的文件導入到目標數據庫中的過渡表中;
3. 開啓系統表寫入設置,將過渡表中帳戶數據導入到目的master數據庫中的sysxlogins中;
4. 將新導入的賬號與數據庫中的用戶名做映射、對應。
本文中的方法適用於MSSQL2000,沒法在MSSQL2005上操做,緣由很簡單,MSSQL2005沒法更改系統表,且其系統表的名稱已經發生變化了。php
--第1步是在源數據庫中master庫的sysxlogins系統表中將賬號信息導出成一個文件c:\logins.dat
exec master..xp_cmdshell 'bcp master..sysxlogins out c:\logins.dat -N -S"(local)" -U"sa" -P"password"'web
--第2步是將導出的文件導入到目標服務器中的master..logins過渡表中
if exists(select * from master..sysobjects where type='u' and name='logins')
drop table master..logins
go
--生成logins過渡表的空表結構
SELECT * INTO master..logins FROM master..sysxlogins WHERE 1=2
go
--將導出的賬號文件導入到logins表中
exec master..xp_cmdshell 'bcp master..logins in c:\logins.dat -N -S"(local)" -U"sa" -P"password"'
gosql
--第3步是將過渡表logins中的信息導入到sysxlogins系統表中
Use Master
go
--開啓系統表寫入設置
sp_configure 'allow updates', 1
reconfigure with override
go
set ansi_nulls off
go
--將logins過渡表中數據寫入到sysxlogins系統表中
insert into
sysxlogins(
srvid,
sid,
xstatus,
xdate1,
xdate2,
name,
password,
dbid,
language)
select
srvid,
sid,
xstatus,
xdate1,
xdate2,
name,
password,
dbid,
language
from sysloginstemp
where name not in (select name from master..sysxlogins)
goshell
set ansi_nulls on
go
Use Master
go
--關閉系統表寫入設置
sp_configure 'allow updates', 0
reconfigure with override
go
--刪除過渡表
drop table master..logins數據庫
--最後一步將數據庫中的用戶信息與login賬號作對應
/*
這一步主要是使用sp_change_users_login,將dbuser與loginuser映射
sp_change_users_login用來消除孤立用戶使用方法:
sp_change_users_login 'Update_One', 'dbUser', 'LoginUser' --將用戶dbUser與賬號LoginUser映射
sp_Msforeachdb用來遍歷DBMS下的每一個數據庫,並執行指定的sql語句。這個存儲過程是非公開的,其用法你們參考:
http://www.databasejournal.com/features/mssql/article.php/3441031
*/服務器
EXEC sp_MSforeachdb @command1=
/*
定義遊標來遍歷獲取?數據庫中的用戶名(存放於sysusers)
及其所對應的MSSQL2000登陸賬號(存放於syslogins)
*/
'declare user_cur cursor for
select dbname=u.name,loginname=l.name
from ?..sysusers u ,master..syslogins l
where u.sid=l.sid and l.sid<>0x01
declare @dbname varchar(255)
declare @loginname varchar(255)
declare @sql varchar(4000)ide
open user_curfetch
fetch next from user_cur into @dbname,@loginnameget
while @@fetch_status=0
begin
--將?數據庫中的用戶名與其對應的MSSQL2000賬號創建映射
select @sql=''?..sp_change_users_login ''''Update_One'''',''''''+@dbname+'''''',''''''+@loginname+''''''''
exec (@sql)
fetch next from user_cur into @dbname,@loginname
end
--關閉遊標
close user_cur
deallocate user_cur
'
總結:
本文在移植MSSQL2000帳戶時使用了一些很是規的方法,能夠用來批量移植賬號,下降了移植過程的繁瑣程度,雖修改系統表的方法是不值得推薦的,但其中使用的sp_Msforeachdb、sp_change_users_login方法及思路仍是值得你們借鑑的。cmd
文章如轉載,請註明轉載自【網管小王的獨立博客】:http://www.5iadmin.com/