none
Procedimiento almacenado que me restaure una base de datos RRS feed

  • Pregunta

  • Buenas, les agradecerian si me ayudan a crear un Procedimiento almacenado que me restaure una base de datos. Al procedimieto yo le voy a pasar en parametro la direccion en la q se encuentra del archivo  ej: C:\BACKUP\SALES.BAK. Pero no se como crear este procedimiento.
    sábado, 16 de abril de 2011 5:29

Respuestas

  • Seria algo como esto

    USE master
    GO
    
    RESTORE DATABASE <Database_Name, sysname, Database_Name>
    	FROM DISK = N'<Backup_Path,,C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\><Database_Name, sysname, Database_Name>.bak' 
    WITH 
    	FILE = 1, 
    	NOUNLOAD, 
    	REPLACE,
    	STATS = 10
    GO
    


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    sábado, 16 de abril de 2011 5:38
  •  

     

    El siguiente procedimiento almacenado permite restaurar en un solo paso:

    ALTER PROCEDURE [dbo].[sp_makedev] 
    @backupfile sysname,
    @newdatabase sysname
    AS
    BEGIN
    DECLARE @fname VARCHAR(200)
    DECLARE @dirfile VARCHAR(300)
    DECLARE @LogicalName NVARCHAR(128)
    DECLARE @PhysicalName NVARCHAR(260)
    DECLARE @type CHAR(1)
    DECLARE @sql NVARCHAR(1000)
    DECLARE @mdfFilePath varchar(1000)
    DECLARE @ldfFilePath varchar(1000)
    CREATE TABLE #dbfiles(
    LogicalName NVARCHAR(128)
    ,PhysicalName NVARCHAR(260)
    ,Type CHAR(1)
    ,FileGroupName NVARCHAR(128)
    ,Size numeric(20,0)
    ,MaxSize numeric(20,0)
    ,FileId INT
    ,CreateLSN numeric(25,0)
    ,DropLSN numeric(25,0)
    ,UniqueId uniqueidentifier
    ,ReadOnlyLSN numeric(25,0)
    ,ReadWriteLSN numeric(25,0)
    ,BackupSizeInBytes INT
    ,SourceBlockSize INT
    ,FilegroupId INT
    ,LogGroupGUID uniqueidentifier
    ,DifferentialBaseLSN numeric(25)
    ,DifferentialBaseGUID uniqueidentifier
    ,IsReadOnly INT
    ,IsPresent INT
    )
    set @mdfFilePath = ''c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data''
    set @ldfFilePath = ''c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data''
    set @sql = ''RESTORE DATABASE '' + @newdatabase + '' FROM DISK = '''''' + @backupfile + '''''' WITH MOVE ''
    DECLARE dbfiles CURSOR FOR
    SELECT LogicalName, PhysicalName, [type] FROM #dbfiles
    INSERT #dbfiles
    EXEC(''RESTORE FILELISTONLY FROM DISK = '''''' + @backupfile + '''''''')
    OPEN dbfiles
    FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF @type = ''D''
    SET @sql = @sql + '''''''' + @LogicalName + '''''' TO '''''' + @mdfFilePath + ''\'' + @newdatabase + ''.mdf'''', MOVE ''
    ELSE IF @type = ''L''
    SET @sql = @sql + '''''''' + @LogicalName + '''''' TO '''''' + @ldfFilePath + ''\'' + @newdatabase + ''.ldf''''''
    FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    END
    CLOSE dbfiles
    DEALLOCATE dbfiles
    EXEC(@SQL)
    END

     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    sábado, 16 de abril de 2011 22:43

Todas las respuestas

  • Seria algo como esto

    USE master
    GO
    
    RESTORE DATABASE <Database_Name, sysname, Database_Name>
    	FROM DISK = N'<Backup_Path,,C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\><Database_Name, sysname, Database_Name>.bak' 
    WITH 
    	FILE = 1, 
    	NOUNLOAD, 
    	REPLACE,
    	STATS = 10
    GO
    


    Angel R. Jimenez G.
    Software Development
    Santo Domingo
    Republica Dominicana
    sábado, 16 de abril de 2011 5:38
  • él comando es el que comenta Angel, solo ten en cuenta que no puedes restaurar una base de datos si estás conectado a ella, por lo que ese procedimiento habrás de crearlo por ejemplo en MSDB.

    por ejemplo

    use msdb

    go

    create procedure RestauraBBDD as

    begin

     restore database sales from disk='c:\backup\sales.bak'

    end

    Si te da error, asegurate que no hay nadie conectado antes

     


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    sábado, 16 de abril de 2011 9:47
    Moderador
  •  

     

    El siguiente procedimiento almacenado permite restaurar en un solo paso:

    ALTER PROCEDURE [dbo].[sp_makedev] 
    @backupfile sysname,
    @newdatabase sysname
    AS
    BEGIN
    DECLARE @fname VARCHAR(200)
    DECLARE @dirfile VARCHAR(300)
    DECLARE @LogicalName NVARCHAR(128)
    DECLARE @PhysicalName NVARCHAR(260)
    DECLARE @type CHAR(1)
    DECLARE @sql NVARCHAR(1000)
    DECLARE @mdfFilePath varchar(1000)
    DECLARE @ldfFilePath varchar(1000)
    CREATE TABLE #dbfiles(
    LogicalName NVARCHAR(128)
    ,PhysicalName NVARCHAR(260)
    ,Type CHAR(1)
    ,FileGroupName NVARCHAR(128)
    ,Size numeric(20,0)
    ,MaxSize numeric(20,0)
    ,FileId INT
    ,CreateLSN numeric(25,0)
    ,DropLSN numeric(25,0)
    ,UniqueId uniqueidentifier
    ,ReadOnlyLSN numeric(25,0)
    ,ReadWriteLSN numeric(25,0)
    ,BackupSizeInBytes INT
    ,SourceBlockSize INT
    ,FilegroupId INT
    ,LogGroupGUID uniqueidentifier
    ,DifferentialBaseLSN numeric(25)
    ,DifferentialBaseGUID uniqueidentifier
    ,IsReadOnly INT
    ,IsPresent INT
    )
    set @mdfFilePath = ''c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data''
    set @ldfFilePath = ''c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data''
    set @sql = ''RESTORE DATABASE '' + @newdatabase + '' FROM DISK = '''''' + @backupfile + '''''' WITH MOVE ''
    DECLARE dbfiles CURSOR FOR
    SELECT LogicalName, PhysicalName, [type] FROM #dbfiles
    INSERT #dbfiles
    EXEC(''RESTORE FILELISTONLY FROM DISK = '''''' + @backupfile + '''''''')
    OPEN dbfiles
    FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF @type = ''D''
    SET @sql = @sql + '''''''' + @LogicalName + '''''' TO '''''' + @mdfFilePath + ''\'' + @newdatabase + ''.mdf'''', MOVE ''
    ELSE IF @type = ''L''
    SET @sql = @sql + '''''''' + @LogicalName + '''''' TO '''''' + @ldfFilePath + ''\'' + @newdatabase + ''.ldf''''''
    FETCH NEXT FROM dbfiles INTO @LogicalName, @PhysicalName, @type
    END
    CLOSE dbfiles
    DEALLOCATE dbfiles
    EXEC(@SQL)
    END

     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    sábado, 16 de abril de 2011 22:43