# پایگاه‌های داده > SQL Server > مدیریت دیتابیس (Database Administration) > Backup & Restore >  مشکل این کد برای restore کجاست؟

## veniz2008

سلام دوستان،من از stored procedure زیر برای restore استفاده میکنم ولی خطا میده،اینم عکسی از خطا،مشکلش کجاست؟
restore.JPG

----------


## baktash.n81@gmail.com

خطای اول که معلومه نمی تونید از گزینه Use درونSP استفاده کنید ... 

اون With آخر رو برای چی نوشتید ؟؟ یعنی چه کاری قراره انجام بده ...

----------


## veniz2008

من براساس کد زیر داخل محیط سی شارپ عمل Restore رو بدرستی انجام میدم،حالا میخوام این کد رو به پروسیجر تبدیل کنم،در واقع آدرس فایل بک آپ رو بهش بدم و عمل restore انجام بشه:
کد نوشته شده در محیط #C :
ALTER DATABASE tel SET SINGLE_USER with ROLLBACK IMMEDIATE Use master
 RESTORE DATABASE tel FROM DISK='" + txtselectbackup.Text + "' WITH REPLACE
حالا شما با توجه به این دستور، sp ای رو که من نوشتم ایرادش کجاست؟چرا داخل محیط ویژوال use رو قبول میکنه ولی داخل sql قبول نمیکنه؟

----------


## حمیدرضاصادقیان

سلام.
داخل یک Stored Procedure نمیتوانید یک دیتابیس دیگه رو Use کنید. به خاطر اینکه اون Procedure داره داخل اون دیتابیس اجرا میشه و با این روش ارتباط با اون دیتابیس قطع میشه و مشکل ایجاد خواهد شد.
شما میتوانید داخل یک SP ابتدا User های متصل به اون دیتابیس رو Kill کنید سپس Restore رو انجام بدید.

----------


## veniz2008

> سلام.
> داخل یک Stored Procedure نمیتوانید یک دیتابیس دیگه رو Use کنید. به خاطر اینکه اون Procedure داره داخل اون دیتابیس اجرا میشه و با این روش ارتباط با اون دیتابیس قطع میشه و مشکل ایجاد خواهد شد.
> شما میتوانید داخل یک SP ابتدا User های متصل به اون دیتابیس رو Kill کنید سپس Restore رو انجام بدید.


من نمیدونم چطوری باید user ها رو kill کنم، میشه بیشتر توضیح بدید یعنی با چه کدی باید اینکار رو انجام بدیم؟

----------


## alimanam

با سلام




> من نمیدونم چطوری باید user ها رو kill کنم، میشه بیشتر توضیح بدید یعنی با چه کدی باید اینکار رو انجام بدیم؟


یک روش ساده استفاده از کد زیر است :

ALTER DATABASE <Put Your Database Here> SET OFFLINE WITH ROLLBACK IMMEDIATE

موفـــق باشید./

----------


## veniz2008

دوستان من sp مربوط به restore رو بصورت زیر نوشتم و بدون خطا اجرا شد ولی درون محیط ویژوال که میخوام این sp رو صدا بزنم و دیتابیس رو restore کنم با خطای زیر مواجه میشم:
کد sp :
create proc myrestore2
@pathfile nvarchar(300)
as
ALTER DATABASE tel SET OFFLINE with ROLLBACK IMMEDIATE RESTORE DATABASE tel FROM DISK= @pathfile WITH REPLACE
go
خطای اتفاق افتاده درون ویژوال استودیو:
restore3.JPG

----------


## حمیدرضاصادقیان

خوب شما بعد از Restore باید دیتابیس رو به online تبدیل کنید.با استفاده از 
 Alter Databse DBname Set online

----------


## veniz2008

آقا این کد آدمو بدبخت میکنه!!!!!
من کدی رو که داده بودید به آخر sp خودم اضافه کردم ولی یه مشکل عجیب پیش میاد. بعد از زدن دکمه restore اطلاعات به درستی بازیابی میشن ولی sp از درون sql و قسمت stored procedure هام حذف میشه(نه تنها اون sp بلکه بقیه sp های مربوط به restore رو که بصورت آزمایشی ایجاد کرده بودم همه رو پاک کرد، در واقع انگار روی تک تک  sp های مربوط به restore کلیک راست کرده باشیم و delete رو زده باشیم). یعنی بار اول برنامه به درستی اجرا میشه وقتی برنامه رو میبندم و دوباره اجرا میکنم و میخوام دوباره بازیابی اطلاعات کنم پیغام خطا میده که این sp وجود نداره که همونطور که گفتم با مراجعه به sql ، میبینم که sp حذف شده( در واقع همه sp های مربوط به restore حذف میشن). چند بار تست کردم ولی همین مشکل وجود داره. لطفا راهنمایی کنید. اینم sp ای که استفاده میکنم:
create proc myrestore5
@pathfile nvarchar(300)
as
ALTER DATABASE tel SET OFFLINE with ROLLBACK IMMEDIATE RESTORE DATABASE tel 
FROM DISK= @pathfile with replace alter database tel set online 
go

----------


## veniz2008

چرا از دوستان کسی راهنمایی نمیکنه؟؟؟، کاملا واسم عجیبه که این سوال این همه مدت باقی مونده و کسی یه راهنمایی جامع نمیکنه.
واسه من عجیب و جالبه که چرا این کد تمام spهای مربوط به restore رو پاک میکنه. از دوستان و مدیران این بخش تقاضا دارم که به تاپیک هایی که ایجاد میشه توجه کنند. لطفا راهنمایی کنید.

----------


## حمیدرضاصادقیان

> دوستان و مدیران این بخش تقاضا دارم که به تاپیک هایی که ایجاد میشه توجه کنند


تمامی دوستان و مدیران هم سرکار هستند و مشغولند.اگر فرصت کنند جواب خواهند داد.

این کد ربطی به حذف شدن sp های شما نداره.
ممکنه اون backup که دارید بازیابی میکنید قبل از ایجاد شدن اون sp ها تهیه شده. شما ابتدا آخرین backup رو بازیابی کنید و تمامی تغییرات رو بدید و ازش یک backup گرفته و مجدد restore کنید.
شما هر backup که بازیابی میکنید در واقع آخرین تغییراتی که تا اون لحظه در دیتابیس بوده و ازش backup گرفته شده restore میکنه و اگر بعد از اون هرکاری کرده باشید با Restore اون backup همه اونها حذف خواهند شد، دقیقا مشابه همین اتفاقی که برای شما رخ داده.

----------


## veniz2008

اوکی حل شد، نکته اش همون بود که گفتید. از جناب صادقیان و بقیه دوستان که کمک کردن تا مشکلم حل بشه تشکر میکنم.

----------


## ali_habibi1384

public Boolean Restore(string PathMainDataBase, string PathFileBackUp)
        {
            try
            {
                ExecuteNoneQuery(CommandType.Text, @"use master RESTORE DATABASE [" + PathMainDataBase + "] FROM DISK='" + PathFileBackUp + "'", null);
                return true;
            }
            catch
            {
                return false;
            }
        }

----------

