回答:
古いサーバーから新しいサーバーにデータベースを移行する必要があるため、以下はそれを自動化するスクリプトです。
重要:スクリプトを実行する前に、テストサーバーでテストして、スクリプトの機能を理解してください。
set nocount on
/******************************************************************************
Author :: Kin
Desc :: Transfer Logins, Databases from one instance/Server to another
*******************************************************************************/
declare @datafile varchar(255),
@logfile varchar(255),
@dbid tinyint,
@SQLText varchar(8000),
@dbname varchar(255),
@destserver varchar(255),
@SQLText2 varchar(8000)
set @destserver ='' --Destination Server Name goes here.
--1.Transfer Logins
select @SQLText='exec master..xp_cmdshell ''sqlcmd -S'+@@servername+' -E -Q"execute master.dbo.sp_help_revlogin" -oD:\logs\revloginout.sql'''
--print @sqltext
exec (@sqltext)
-- Create on Destination Server.
select @SQLText='exec master..xp_cmdshell ''sqlcmd -S'+@destserver+' -E -iD:\logs\revloginout.sql'''
--print @sqltext
exec (@sqltext)
--2. Detach All Local Databases and prepare for Attach on dest.
--- if you want to filer only some database, then you can do it here !!
if exists(select 1 from tempdb..sysobjects where name like '%#filetable%')
begin
drop table #filetable
end
create table #filetable (mdf varchar(255),ldf varchar(255),dbid tinyint,dbname varchar(100),fileid tinyint)
--
insert #filetable (mdf,dbid,fileid)
select physical_name,database_id,data_space_id from sys.master_files where data_space_id=1
insert #filetable (ldf,dbid,fileid)
select physical_name,database_id,data_space_id from sys.master_files where data_space_id=0
update u
set u.dbname = s.name
from #filetable u
inner join master..sysdatabases s
on u.dbid = s.dbid
select @dbid = min(dbid) from #filetable where dbid > 4
while @dbid is not null
begin
select @SQLText = 'alter database '+ dbname from #filetable where dbid = convert(varchar,@dbid)
select @SQLText = @SQLText+' set single_user with rollback immediate'
select @SQLText = @SQLText+' exec master..sp_detach_db ' + dbname from #filetable where dbid = convert(varchar,@dbid)
print @SQLText
Exec(@SQLText)
select @SQLText2 = 'exec opendatasource(''SQLNCLI'',''Datasource='+@destserver+';Persist Security Info=False;Integrated Security=SSPI'').master.dbo.sp_attach_db '''+dbname+'''' from #filetable where dbid = @dbid
select @SQLText2= @SQLText2+','''+ mdf+'''' from #filetable where dbid = @dbid and mdf is not null
select @SQLText2=@SQLText2+','''+ ldf+'''' from #filetable where dbid = @dbid and ldf is not null
print @SQLText2
Exec(@SQLText)
select @dbid = min(dbid) from #filetable where dbid > 4 and dbid > @dbid
end
select * from #filetable
drop table #filetable
--Finally Shutdown SQL Server
shutdown with nowait