PDA

View Full Version : سوال: backup از چند جدول محدود در یک database



mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 09:22 صبح
سلام. من میخوام به جای اینکه از کل یک دیتا بیس ، backup بگیرم فقط از بعضی جدولاش backup بگیرم. لطفا بهم کمک کنید. خیلی بهش احتیاج دارم.

ASKaffash
چهارشنبه 01 خرداد 1387, 10:04 صبح
با سلام
دوست عزیز این توضیح برای کمک کردن دیگران کم است اطلاعاتی درخصوص نوع پایگاه داده کنونی و مقصدی که جداول خاص شما قرار است در آن نگهداری شود و ... چون ممکنه با یک SP ساده بتوان فقط جدولهای خاص شما را مثلا از SQLServer به Access از طریقهای OpenRowset یا OpenQuery ارسال کرد

mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 10:19 صبح
ببینید من دارم با c# یه برنامه مینویسم که توی این برنامه وقتی کاربر یکی از database های موجود در سیستم رو انتخاب میکنه همه جدول های اون database لیست میشه. حالا باید از جدول هایی که خودش انتخاب میکنه تو یه مسیر دلخواه backup بگیره. بانک اطلاعاتی من sqlserver هست. میتونم از کل یه دیتابیس backup بگیرم ولی اینکه چطور فقط از جدول های انتخاب شده backup بگیرم دچار مشکل شدم...

ASKaffash
چهارشنبه 01 خرداد 1387, 10:28 صبح
با سلام
سعی کنید این بخش را به یک Sp واگذارکنیدچطور؟
1- ابتدا پس از دریافت کلیه نام جداول در C# بصورت یک رشته ممتد به عنوان پارامتر ورودی به SPارسال کنید
TBL1,TBL2,TBL3,...
2-درون Sp با استفاده از یک حلقه تکرار نام جداول را یکی یکی استخراج کنید
3- برای هر جدول استخراج شده درون حلقه ابتدا جدول را حذف وسپس کپی جدید را ایجاد کنید
شبه کد این بخش شبیه ذیل است :
While ....
Begin

Exec('Drop ...')
Exex(' Insert into DB.dbo.TBL? Select * from Tbl? ...(

End

mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 10:48 صبح
ممنونم از راهنماییتون ولی من درست متوجه نشدم..!! یعنی با این کار تو مسیر داده شده یک فایل bak.* ذخیره میشه؟!! میشه بیشتر توضیح بدین؟؟ مثلا من میخوام از database با نام database1 یک backup بگیرم که فقط شامل table1,table2 باشه. یعنی به سایر جدول هاش نیازی ندارم... وقتی از کد زیر استفاده میکنم از کل database یک backup میگیره که شامل اطلاعات همه جدول ها میشه ولی من اطلاعات بعضی از جدول هاشو میخوام!! باید backup به شکل فایل bak.* در مسیر انتخابی ذخیره شه. از sp نمیخوام استفاده کنم.
BACKUP DATABASE { database_name | @database_name_var }
TO < backup_device > [ ,...n ]

ASKaffash
چهارشنبه 01 خرداد 1387, 11:29 صبح
با سلام
نه شما با این روش جداول مورد نظر را به یک DataBase دیگر روی همان سرور ارسال میکنید چون همانطور که میدانید نمیشود از جداول خاص تنها BackUp گرفت ولی اینجوری جداول را به یک پایگاه داده دیگر ارسال میکنید بعد از اون پایگاه جدید BackUp میگیری اینجوری فقط اونهایی را که میخواهید BackUp میگیرید

mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 11:55 صبح
من تا حالا با sp کار نکردم میشه برام توضیح بدید؟

ASKaffash
چهارشنبه 01 خرداد 1387, 12:31 عصر
با سلام
SP یا Stored Procuder یک برنامه به زبان پایگاه داده SQLServer است که شما میتوانید دستورت SQL را در آن بنویسید ودر صورت علاقه تا 1024 پارامتر بعنوان ورودی به آن ارسال کنید و عموما خروجی یک دستور Select را دریافت کنید برای اطلاع بیشتر شما یک جزوه تحت عنوان برنامه نویسی تحت SQLServer200X نگارش کرده ام که در بخش SQLServer و در همین سایت چند روز پیش قرار داده ام از صفر تا 100 برنامه نویسی را در آن درس داده ام لطفا بعدا نظر خود را در خصوص جزوه به اینجانب جهت نسخه های بعدی منعکس کنید

SabaSabouhi
چهارشنبه 01 خرداد 1387, 13:09 عصر
با سلام
يك اشكال منطقى در پرسش شما وجود داره. چرا مى‌خواهيد فقط از برخى جدول‌ها Backup بگيريد؟
مگر اين نيست كه Backup گرفتن براى اين انجام مى‌شه كه در شرايط خاص بخواهيم اون رو Restore كنيم؟ در اين صورت اگه فقط از برخى جدول‌ها Backup گرفته شده باشه با اولين Restore ارتباط جدول‌ها با هم به مشكل خواهد خورد.
در اين صورت عمل Restore انجام پذير نخواهد بود و در نتيجه Backup گرفتن هم كاملاً بى‌ارزش خواهد شد.

صبا صبوحى

mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 13:29 عصر
شرکتی که کار میکنم از من خواستن بنویسم در ضمن ممکنه کاربر تو یه شرایطی بخواد فقط اطلاعات چند جدول خاص رو داشته باشه..
مشکل من هنوز حل نشده میشه یه نفر یه نمونه کد برام بذاره...

ASKaffash
چهارشنبه 01 خرداد 1387, 14:02 عصر
با سلام
یک Sp برایت نوشتم که استفاده کنید


Create Proc BackupToNewDB
@S VarChar(8000)
As
Declare @R VarChar(8000)
Declare @C1 BigInt,@C2 BigInt
Set @C1=0
While (@C1<Len(@S)) Begin
Set @C1=@C1+1
if SubString(@S,@C1,1)='[' Begin
Set @C2=0
While (1=1) Begin
Set @C2=@C2+1
if SubString(@S,@C1+@C2,1)=']' Begin
Set @R='Select * Into NewDBName.dbo.'+SubString(@S,@C1+1,@C2-1)+'1 From '+SubString(@S,@C1+1,@C2-1)
Exec(@R)
Break
End
End
End
End

mehrnoosh_al62
چهارشنبه 01 خرداد 1387, 16:11 عصر
ممنون ولی دفعه اول گفتید insert into ولی در این proc گفتید select * into بالاخره من باید چکار کنم؟
گیج شدممممممممممم... چه جوری به s@ مقدار میدید؟؟؟
من فردا باید این برنامه رو تحویل بدم!!!
زیادم نفهمیدم چه جوری از sp استفاده کنم..
مغزم کار نمیکنه...

razavi_university
پنج شنبه 02 خرداد 1387, 02:18 صبح
با سلام
يك اشكال منطقى در پرسش شما وجود داره. چرا مى‌خواهيد فقط از برخى جدول‌ها Backup بگيريد؟
مگر اين نيست كه Backup گرفتن براى اين انجام مى‌شه كه در شرايط خاص بخواهيم اون رو Restore كنيم؟ در اين صورت اگه فقط از برخى جدول‌ها Backup گرفته شده باشه با اولين Restore ارتباط جدول‌ها با هم به مشكل خواهد خورد.
در اين صورت عمل Restore انجام پذير نخواهد بود و در نتيجه Backup گرفتن هم كاملاً بى‌ارزش خواهد شد.

صبا صبوحى
ببخشيد ولي من هم نظر SabaSabouhi رو دارم
اگر بين جداول ديتابيس Relation(رابطه) وجود داشته باشه (كه در اكثر اوقات هم همينطوره) نسخه‌پشتيبان از يكسري جداول كه ممكنه در آينده در ارتباط با جداول ديگه به مشكل بر مي‌خورند چه فايده‌اي داره؟
اصلا چطور ميشه اونها رو Restore كرد كه مطمئنا SQL اجازه اينكار رو نميده
فكر مي كنم بهتر باشه دليل اينطور Backup گيري رو بفرماييد تا شايد راهحل ديگه‌اي بتونيم واسش پيدا كنيم

mehrnoosh_al62
پنج شنبه 02 خرداد 1387, 10:14 صبح
از همگی ممنونم. مشکلم حل شد.