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.