ورود

View Full Version : restore برای sql سرور



benyaminrahimi
یک شنبه 15 اردیبهشت 1392, 11:19 صبح
باز گرداندن بک آپ تو اس کیو ال یکمی سخته برای پشتیبان شرکتها
یه پروسیجر نوشتم که این کارو انجام میده .. خوشحال میشم اگه دوست داشتین اپتیمایزش کنین

ALTER PROCEDURE [dbo].[sp_sys_restore](@dbname NVARCHAR(100),@masir NVARCHAR(500) )
AS

BEGIN

DECLARE @r_name NVARCHAR(500)
DECLARE @r_path NVARCHAR(500)
DECLARE @r_x NVARCHAR(1000)

SELECT @r_name=sys.master_files.name ,
@r_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='ROWS'
SET @r_x=+' ,MOVE '+''''+@r_name+''''+' to '+''''+@r_path+''''
SET @r_x=ISNULL(@r_x,'')





DECLARE @l_name NVARCHAR(500)
DECLARE @l_path NVARCHAR(500)
DECLARE @l_x NVARCHAR(1000)



SELECT @l_name=sys.master_files.name ,
@l_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='LOG'

SET @l_x=+' ,MOVE '+''''+@l_name+''''+' to '+''''+@l_path+''''
SET @l_x=ISNULL(@l_x,'')

DECLARE @f_name NVARCHAR(500)
DECLARE @f_path NVARCHAR(500)
DECLARE @f_x NVARCHAR(1000)

SELECT @f_name=sys.master_files.name ,
@f_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='FILESTREAM'



SET @f_x=+' ,MOVE '+''''+@f_name+''''+' to '+''''+@f_path+''''
SET @l_x=ISNULL(@f_x,'')

DECLARE @runer NVARCHAR(max)
SET @runer='RESTORE DATABASE ['+@dbname+'] FROM DISK = '+''''+@masir+''''+' WITH FILE = 1'
+@r_x
+@l_x
+@f_x
+', NOUNLOAD, REPLACE, STATS = 10 '



exec ('ALTER DATABASE '+ @dbname +' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ')

EXEC (@runer)

exec ('ALTER DATABASE '+@dbname +' SET MULTI_USER ')








END