Technical Article

Quick snapshot

,

/*
Snapshot script:
The script enables a quick creation of snapshots for databases. 
It has two run modes defined by the optional parameter @exec_mode.
 @exec_mode=0 (default) means printing the create snapshot statment and
 @exec_mode=1 means creation of the snapshot database.
 @database is mandatory input parameter.
Tested on SQL Server 2005, 2008, 2012.
Usage:
EXEC [dbo].[Create_UserDb_Snapshot] @database = 'AdventureWorksDW2012'
EXEC [dbo].[Create_UserDb_Snapshot] @database = 'AdventureWorksDW2012', @exec_mode=0
EXEC [dbo].[Create_UserDb_Snapshot] @database = 'CWNET', @exec_mode=1
Date created: 2014-Mar-12
Author: Igor Micev (igor.micev@hotmail.com; igor.micev@outlook.com)
*/
/***************************************************************************
Snapshot script:
	The script enables a quick creation of snapshots for databases. 
	It has two run modes defined by the optional parameter @exec_mode.
	  @exec_mode=0 (default) means printing the create snapshot statement and
	  @exec_mode=1 means creation of the snapshot database.
	  @database is mandatory input parameter.
	Tested on SQL Server 2008 and 2012.

Usage:
	EXEC [dbo].[Create_UserDb_Snapshot] @database = 'AdventureWorksDW2012'
	EXEC [dbo].[Create_UserDb_Snapshot] @database = 'AdventureWorksDW2012', @exec_mode=0
	EXEC [dbo].[Create_UserDb_Snapshot] @database = 'CWNET', @exec_mode=1

Date created:	2014-Mar-12
Author:			Igor Micev (igor.micev@hotmail.com; igor.micev@outlook.com)
***************************************************************************/

USE [master]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Create_UserDb_Snapshot]') AND [type] in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Create_UserDb_Snapshot]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

Create procedure [dbo].[Create_UserDb_Snapshot]
@database varchar(50),
@exec_mode bit=0
as
begin	
	 set nocount on
	 declare @err_text nvarchar(200)
	 if @database in ('master','model','tempdb')
	 begin
		set @err_text = 'Snapshot is not allowed for master, model and tempdb databases.'
		RAISERROR(@err_text,10,1)
		return;
	 end	
	 if object_id('tempdb..#usr_db_files_tbl') is not null
	    drop table #usr_db_files_tbl	
	 create table #usr_db_files_tbl(
		  [logicalName] varchar(100),
		  [physicalName] varchar(200)
	  )
	 insert into #usr_db_files_tbl(logicalName,physicalName)
	 select [mf].[name],[mf].[physical_name]
	 from sys.master_files as [mf]
	 where [mf].[database_id]=db_id(@database) and [mf].[type]=0 and [mf].[name] not in ('master','model','tempdb')

	 if (select count(*) from #usr_db_files_tbl)=0
	 begin
		set @err_text = 'The specified database does not exist.' 
		RAISERROR(@err_text,10,1) 
		return;
	 end
	 
	 declare @dyn_sql nvarchar(max)
	 declare @extension varchar(20)='snap'+right(replace(replace(replace(convert(varchar(20),getdate(),113),'-',''),':',''),' ',''),4)
	 declare @curLogicalName varchar(100), @curPhysicalName varchar(200)
	 
	 declare snap_cursor cursor for
	 select [t].[logicalName], [t].[physicalName] from #usr_db_files_tbl as [t]
	 open snap_cursor

	 declare @snapDbName nvarchar(100)
	 set @snapDbName=@database+'_snapshot_'+replace(replace(replace(convert(varchar(20),getdate(),113),'-',''),':',''),' ','')

	 fetch next from snap_cursor into @curLogicalName,@curPhysicalName
	 set @dyn_sql='CREATE DATABASE '+@snapDbName+' ON '+char(10)
	 while (@@FETCH_STATUS=0)
	 begin
		set @dyn_sql+='(name='''+@curLogicalName+''', filename='''+replace(replace(@curPhysicalName,right(@curPhysicalName,4),'.'+@extension),right(@curPhysicalName,4),'.'+@extension)+''')' 
		fetch next from snap_cursor into @curLogicalName,@curPhysicalName
		if (@@FETCH_STATUS=0)
		 set @dyn_sql+=', '+char(10)
	 end

	 set @dyn_sql+=char(10)
	 set @dyn_sql+='AS SNAPSHOT OF '+@database+char(10)
	 
	 if @exec_mode=convert(bit,0)
	  print char(10)+@dyn_sql
	 
	 if @exec_mode=convert(bit,1)
	 begin
		  begin try
		   exec sp_executesql @dyn_sql
		   print 'Snapshot database: '+@snapDbName+' created successfully.'
		  end try
		  begin catch
		   set @err_text = 'Snapshot for database '+@database+' cannot be created.'
		   RAISERROR(@err_text,16,1) 
		  end catch
	 end
	 
	 close snap_cursor
	 deallocate snap_cursor
	 drop table #usr_db_files_tbl
	 WAITFOR DELAY '00:00:01';
	 return;

end

Rate

4.8 (5)

You rated this post out of 5. Change rating

Share

Share

Rate

4.8 (5)

You rated this post out of 5. Change rating