Generar Snapshot Database Automaticamente


Rara vez tenemos que crear un Snapshot de una base de datos determinada, aun mas, cuando la misma posee múltiples Datafiles y tenemos que andar fijándonos donde están, como se llaman.etc..etc..

En esta ocasión, tuve que armar una script, para crear automáticamente un Snapshot de la base de datos a las 13Hs y a las 20hs respectivamente.
El problema fue armar un script lo suficientemente autonono para que, indistintamente del nombre de la base de datos que necesitemos, el mismo cree el Snapshot donde corresponda y no me interese saber si tiene 1 o 200 Datafiles.

Aquí esta dicho script.


--- Creamos la Base de Datos de Snapshot
DECLARE     @Str NVARCHAR(4000)
DECLARE		@LogicalFileName VARCHAR(500)
DECLARE		@Path VARCHAR(500)
DECLARE     @Fecha VARCHAR(30)
DECLARE     @DatabaseName VARCHAR(30)
DECLARE		@DB VARCHAR(30)
SET	@DB		= 'CS_INT64'

SET @Fecha = RIGHT(REPLICATE('0', 2)    + CAST(DATEPART(DD, GETDATE()) AS VARCHAR(2)), 2) + 
             RIGHT(REPLICATE('0', 2)   + CAST(DATEPART(MM, GETDATE()) AS VARCHAR(2)), 2) + '_' +
             RIGHT(REPLICATE('0', 2)   + CAST(DATEPART(HH, GETDATE()) AS VARCHAR(2)), 2) +
             RIGHT(REPLICATE('0', 2)   + CAST(DATEPART(MINUTE, GETDATE()) AS VARCHAR(2)), 2)

SET @DatabaseName = @DB + '_' + @Fecha
SET @Str = 'CREATE DATABASE ' + @DatabaseName + ' ON '
DECLARE dd CURSOR FOR
SELECT name AS LogicalFileName, physical_name
FROM sys.master_files AS mf
WHERE DB_NAME(database_id) = @DB
AND type_desc = 'ROWS'
AND state = 0
OPEN dd
FETCH NEXT FROM dd INTO @LogicalFileName, @Path
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @Str =  @Str +  '( NAME = ' + @LogicalFileName + ', FILENAME = ''' + SUBSTRING(@Path, 1, CHARINDEX(@DB, @Path) -1) + @LogicalFileName + '' +  '_' + @Fecha + '.ss' +'''' + '),'
FETCH NEXT FROM dd INTO @LogicalFileName, @Path
END
CLOSE dd
DEALLOCATE dd

SELECT @Str = REVERSE(SUBSTRING(REVERSE(@Str), CHARINDEX(',', REVERSE(@Str)) +1, DATALENGTH(@Str)))
SELECT @Str = @Str + ' AS SNAPSHOT OF ' + @DB 


EXEC (@Str)

Espero les sirva.