-- create a snapshot for a database. (caution: a database can't be backuped if there is a snapshot for it.)
Declare @INT_DB_NAME varchar(30),@INT_DB_NAME_SNAPSHOT varchar(40),@SQL varchar(1000)
set @INT_DB_NAME = 'test_db'
set @INT_DB_NAME_SNAPSHOT = @INT_DB_NAME+'_SNAPSHOT'
IF EXISTS (SELECT name FROM sys.databases WHERE name = @INT_DB_NAME_SNAPSHOT) exec ('DROP DATABASE '+@INT_DB_NAME_SNAPSHOT)
set @SQL = 'create database '+@INT_DB_NAME_SNAPSHOT+' ON'+char(13)
select @SQL=@SQL+'(Name = '+DB_FILE.name+',FileName = "'+REPLACE(REPLACE(upper(DB_FILE.physical_name),'.MDF','_snapshot.mdf'),'.NDF','_snapshot.ndf')+ '")'+char(13)+','from master.sys.databases DB join master.sys.master_files DB_FILE on DB. database_id= DB_FILE. database_id where DB.name = @INT_DB_NAME and upper(DB_FILE.type_desc)<>'LOG'
set @SQL = left(@SQL,len(@SQL)-1)+'AS SNAPSHOT OF '+@INT_DB_NAME
exec (@SQL)
-- restore a database from its snapshot
use master
Declare @INT_DB_NAME varchar(30),@INT_DB_NAME_SNAPSHOT varchar(40),@SQL varchar(1000)
set @INT_DB_NAME = 'test_db'
set @INT_DB_NAME_SNAPSHOT = @INT_DB_NAME+'_SNAPSHOT'
set @SQL='ALTER DATABASE '+@INT_DB_NAME+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE'
exec (@SQL)
RESTORE DATABASE @INT_DB_NAME from DATABASE_SNAPSHOT = @INT_DB_NAME_SNAPSHOT
set @SQL='ALTER DATABASE '+@INT_DB_NAME+' SET MULTI_USER'
exec (@SQL)