上月回复了一个帖子,帖子要求如题,经试验找到办法如下:
用xp_cmdshell 命令执行dir命令,找出指定盘上的数据库文件并保存到一个表中,然后取出表中的数据库文件名,执行附加操作。程序如下:
/*
将下面一段程序作为一个作业,在做GHOST之前写入服务器,并让它在代理启动时自动运行,
这样,在恢复系统并重启后,会自动运行该作业,它自动扫描指定的路径并自动附加数据库.
数据库文件可以放在指定的文件夹或指定盘中,另外,此程序未考虑日志文件.
另,系统应开启xp_cmdshell.
*/
use master
go
create table tb(txt nvarchar(100))
insert into tb(txt)
exec xp_cmdshell 'dir d:\csdn\sqlserver' --扫描指定文件夹
--获取指定路径上的数据库文件名
--亦可采用 exec xp_cmdshell 'dir d:\*.mdf /s' 找到所有mdf文件,
--并且如果有多个逻辑盘的话,还可以执行多个 insert
--不过下面取出数据库文件名的部分要改一下
declare @sql nvarchar(max)
select @sql=isnull(@sql+';','')+'CREATE DATABASE ['+
substring(txt,37,len(txt)-32)+'] ON (FILENAME = N''d:\csdn\sqlserver'+
substring(txt,37,len(txt)-36)+''') FOR ATTACH '
from tb where len(txt)>=37 and right(txt,4)='.mdf'
and not exists(select 1 from sysdatabases where name=substring(a.txt,37,len(a.txt)-32))
exec (@sql)
--附加
drop table tb
如为了限制该作业仅执行一次,可以在master数据库中设置一个表,加一个标志,作业运行是否执行数据附加由此标志确定。在GHOST前置1,这样作业就能正确运行。运行完毕后,将标志复位为0,则以后再启动代理时就不会再执行附加操作。