Bugriy Цитата: Если бы я знал SQL-транзакт, то я бы просто написал скрипт вместо того чтоб сюда писать
Вот, примерно так:
скрипт писал под 2005, но в 2000 тоже будет работать,
перекинь коментарии, где список полей для #Backup формируется, дело в том,
что 2005 и 2000 возвращают разлиные наборы полей при запуске RESTORE FILELISTONLY, ну и еще, возможно понадобится открыть xp_cmdshell,
в 2005 она по умолчанию закрыта.
Удачи!
Скрипт поднимает ВСЕ бакапы из заданного каталога
по указанным папкам для MDF и LDF
Бакапы должны иметь расширение bak!
Код: use master
/*
drop database test1
go
drop database test2
go
drop database test3
go
*/
declare @FileName varchar(255),
@BackupPath varchar(256),
@BackupFile varchar(256),
@NewDatabaseMDFPath varchar(256),
@NewDatabaseLDFPath varchar(256),
@NewDatabaseName varchar(256),
@Log varchar(128),
@Data varchar(128),
@LogFile varchar(256),
@DataFile varchar(256)
select @BackupPath = 'C:\MSSQL\Backup\Test',
@NewDatabaseMDFPath = 'C:\MSSQL\Data',
@NewDatabaseLDFPath = 'C:\MSSQL\Data\Logs'
if object_id('tempdb..#Dir') is not null drop table #Dir
-- для работы в 2005 - запуск xp_cmdshell нужно сначала разрешить!!!
create table #Dir (Output varchar(255) null)
-- Бакапы должны иметь расширение .bak!!!
insert into #Dir
exec('xp_cmdshell ''dir '+@BackupPath+'\*.bak /B''')
delete from #Dir where output not like '%.bak' or output is null
-- теперь в #Dir чистый список бакапов
-- select * from #Dir
DECLARE Files_Cursor CURSOR FORWARD_ONLY FOR
SELECT Output FROM #Dir
OPEN Files_Cursor
FETCH NEXT FROM Files_Cursor
INTO @FileName
WHILE @@FETCH_STATUS = 0
BEGIN
print @FileName
--тут лежит бакап
select @BackupFile = @BackupPath+'\'+@FileName
if not object_id('tempdb..#backup') is null drop table #backup
create table #backup
-- Список полей для SQL 2000
-- (logicalname varchar(50) null, physicalname varchar(50) null, type char(5) null, filegroupname varchar(50) null, size float null, maxsize float null)
--список полей для SQL 2005
(LogicalName nvarchar(128), PhysicalName nvarchar(260), type char(5) null, filegroupname nvarchar(128) null,
Size numeric(20,0), MaxSize numeric(20,0), FileID bigint, CreateLSN numeric(25,0), DropLSN numeric(25,0) NULL,
UniqueID uniqueidentifier, ReadOnlyLSN numeric(25,0) NULL, ReadWriteLSN numeric(25,0) NULL,
BackupSizeInBytes bigint, SourceBlockSize int, FileGroupID int, LogGroupGUID uniqueidentifier NULL,
DifferentialBaseLSN numeric(25,0) NULL, DifferentialBaseGUID uniqueidentifier, IsReadOnly bit, IsPresent bit)
insert into #backup
exec('RESTORE FILELISTONLY FROM DISK = '''+@BackupFile+''' WITH FILE = 1 , NOUNLOAD')
select @Data = logicalname, @NewDataBaseName = logicalname from #backup where type = 'D'
select @DataFile = @NewDatabaseMDFPath+'\'+@NewDatabaseName+'.mdf'
select @Log = logicalname from #backup where type = 'L'
select @LogFile = @NewDatabaseLDFPath+'\'+@NewDatabaseName+'.ldf'
print @DataFile
print @LogFile
RESTORE DATABASE @NewDataBaseName FROM DISK = @BackupFile WITH FILE=1, NOUNLOAD, STATS=10, RECOVERY, REPLACE,
MOVE @Data TO @DataFile,
MOVE @Log TO @LogFile
FETCH NEXT FROM Files_Cursor
INTO @FileName
END
CLOSE Files_Cursor
DEALLOCATE Files_Cursor