# پایگاه‌های داده > SQL Server > مدیریت دیتابیس (Database Administration) >  ذخيره سازي فايل در SQL Server

## piroozman

سلام. در برنامه اي كه در حال حاضر دارم مي نويسم بايد فايلهايي حجيم (از 2 مگابايت تا شايد 500 مگابايت) ذخيره كنم. آيا مي توان فايلهاي حجيم را در ديتابيس اس كيو ال ذخيره كنم؟ نوع داده فيلد بايد چه باشد؟ چيزي كه مطالعه كردم نشون مي ده براي ذخيره سازي فايلها بايد از Varbinary استفاده كنيم. اما انگار اين نوع فقط تا 8000 بايت (حدود 8 مگابايت) پشتيباني ميكند. لطفا دوستان راهنمايي كنند.

----------


## golbafan

سلام
از فیلد blob استفاده کنید
البته در حالت پیشفرض حد اکثر 256 مگ میتونید در هر فیلد بریزید
برای افزایش ظرفیت باید تنظیمات sql رو تغییر بدید

https://technet.microsoft.com/en-us/...=sql.110).aspx

----------


## SabaSabouhi

> سلام. در برنامه اي كه در حال حاضر دارم مي نويسم بايد فايلهايي حجيم (از 2 مگابايت تا شايد 500 مگابايت) ذخيره كنم. آيا مي توان فايلهاي حجيم را در ديتابيس اس كيو ال ذخيره كنم؟ نوع داده فيلد بايد چه باشد؟ چيزي كه مطالعه كردم نشون مي ده براي ذخيره سازي فايلها بايد از Varbinary استفاده كنيم. اما انگار اين نوع فقط تا 8000 بايت (حدود 8 مگابايت) پشتيباني ميكند. لطفا دوستان راهنمايي كنند.


سلام
ذخیره کردن فایل‌های حجیم تو SQL به نظر راه حل خوبی نیست، هر چند که عملی هست.
بهتره از FTP Server در کنار برنامه استفاده کنی و آدرس فایل‌ها رو تو دیتابیس نگهداری کنی.
اگر دنبال امنیت هستی FTP Server اون رو برات تامین می‌کنه
و اگر دنبال راحتی هم هستی FTP Server نیازت رو رفع می‌کنه.

صبا صبوحی

----------


## golbafan

سلام
ذخیره فقط نام فایل راه حل خوبیه چون حجم دیتابیس زیاد نمیشه
اما مشکل اینه که اگر فایل تغییرنام بده یا جابجا بشه دیگه نمیشه براحتی پیداش کرد
مگر اینکه با استفاده از ابزارهایی بتونید نام و مکان فایل ها رو مانیتور کرده و در دیتابیس آپدیت کنید (البته خالی از اشکال نیست)
مشکل دیگه ای نداره

///
يك FTP Server مي‌تواند سرويس دهنده‌اي بسيار كارآمد باشد در عين  اينكه عدم نظارت و كنترل آن ممكن است نقطه ضعفي براي سيستم به شمار آيد.
FTP با شماره پورت 21 ، يك پروتكل قديمي ‌است و كاربرد آن به زماني بر مي‌گردد كه استفاده از پورت 80 (WEB) نيز چندان فراگير نشده بود. زماني مي‌توان از يك کامپيوتر (با سيستم عامل XP ، 2000 يا 2003) خدمات FTP دريافت نمود كه اين سرويس روي آن سيستم عامل فعال شده باشد يعني يك FTP Server روي سرور مورد نظر در حال كار باشد. بعد از برقراري ارتباط با FTP Server در حقيقت شما به يك FTP Client تبدل مي‌شويد.
 بوسيله اين پروتكل مي‌توان فايل ها را در سرويس دهنده Upload نيزكرد اما براي قرار دادن فايل در طرف سرويس دهنده بايستي هر اپراتور يك FTP Account  داشته باشد كه توسط ارائه دهنده سرويس در اختيار کاربر يا همان FTP Client قرار گرفته و بوسيله آن با توجه به حق دسترسي تعيين شده مي‌توان به ايجاد ، اضافه، حذف و يا تغيير فايل‌هاي موجود در سرويس دهنده از طريق يك دستگاه ديگر بپردازد. براي  Uploadكردن مي‌توان از برنامه‌هايي مانند Cute FTP ،  Flash FXP ، WS FTP و ... استفاده نمود.

----------


## SabaSabouhi

سلام
من حدس می‌زنم ( چون اطلاعات دوستمون کافی نبود ) که این فایل‌ها برای ارائه در وب‌سایت نگهداری می‌شن. 
در این صورت به هیچ عنوان نیازی به وجود FTP Client روی کامپیوتر مقصد و یا داشتن یک FTP Account نیست.
همه این کارها توسط وب سایت، و یا وب سرویس به راحتی قابل اجرا هست و فایل مورد نیاز توسط وب سایت
upload شده و توسط کاربر download می‌شود.

اگر برنامه desktop و local باشه که اصولاً نیازی به FTP Server نیست و می‌شه با FileSystem به راحتی پیاده‌سازی کرد.
اگر برنامه تحت شبکه هم باشه باز هم می‌شه با Windows Sharing پیاده سازی بشه.
البته این‌ها رو گفتم فقط برای دوستانی که از FTP خوششون نمیاد. چون خودم واقعاً به این سرویس علاقه زیادی دارم 
و خیلی خوب تا حالا کارهام رو راه انداخته.

صبا صبوحی

پانوشت: دوستمون piroozman اگه صورت مساله رو بهتر و شفاف‌تر مطرح می‌کردن، ما هم به‌تر می‌تونستیم راهنمایی کنیم.

----------


## golbafan

سلام به همه
خانم صبوحی این که گفتید مشکل تغییر نام فایل و یا اصلا حذف شدن فایل رو حل میکنه؟
اگر میکنه لطف میکنید توضیح بدید؟

----------


## SabaSabouhi

> سلام به همه
> خانم صبوحی این که گفتید مشکل تغییر نام فایل و یا اصلا حذف شدن فایل رو حل میکنه؟
> اگر میکنه لطف میکنید توضیح بدید؟


سلام
دوست عزیز، من آقای صبوحی هستم ( گمان کنم قبلاً هم به شما گفته باشم )

و اما بحث تغییر نام و یا پاک کردن، 
من یه سوال می‌کنم. منظور شما از این تغییر نام و یا پاک کردن، ایجاد اخلال عمدی در کار نرم‌افزار هست یا یک اتفاق تصادفی؟
اگر بحث تعمد در میان باشه، بردن فایل‌ها به داخل دیتابیس چیزی رو حل نمی‌کنه، چون به راحتی می‌شه داخل دیتابیس هم 
دستکاری کرد.
و اگر منظور شما یک عمل تصادفی باشه باز هم احتمالش کم هست.
برنامه‌نویس‌ها از فولدرهای خاص داده برای نرم‌افزار استفاده می‌کنن که به صورت معمول در دسترس کاربران نیست.
تو ویندوز 7 به بالا تو مسیر c:\programData قرار داره که به صورت عادی مخفی هست. بنابراین احتمال حذف یا تغییر نام
تصادفی خیلی کم هست.
در حالت عمدی هم نظر من اینه که اگر یه کاربر نرم‌افزار شما رو بخره و بخواد عمداً توش خراب‌کاری کنه، اشکالی نداره 
بگذارین خراب‌کاری کنه. میل خودشه. مثل این می‌مونه که یه نفر یه ساندویچ بخره، کاغذ دورش رو باز کنه و توش خاک بریزه.
پس ما کافیه احتمال خراب شدن تصادفی رو بررسی کنیم. ضمن این که استفاده از FileServer برای شبکه ( با دسترسی‌های 
خاص ) و یا FTP Server و به‌ویژه استفاده از سرویس‌های وب ( وب سایت / وب سرویس ) می‌تونه این احتمال رو به حداقل
برسونه.

اما اگه باز دوست دارین از دیتابیس استفاده کنین، باز هم میل خودتونه. اما تصور کنین با صورت مساله دوستمون،
اگه فقط 100 تا فایل 100 مگابایتی داشته باشیم، 10 گیگابایت حجم دیتابیسمون می‌شه. حالا شما در نظر بگیرین
که بخواین روزانه از این دیتابیس backup بگیرین. اگه این شرایط به نظرتون منطقی میاد، خوب پس همین کار رو 
بکنید.

من برای شرایطی که فایل‌ها طبق گفته‌ی دوستمون از 2 تا 500 مگابایت هستن، این نظر رو دارم. اگه حجم فایل‌ها
از 2 تا 500 کیلوبایت بود، شرایط کاملاً فرق داشت.

صبا صبوحی

----------


## golbafan

> سلام
> دوست عزیز، من آقای صبوحی هستم ( گمان کنم قبلاً هم به شما گفته باشم )


ببخشید فکر کردم اسمتون صبا هست  :اشتباه: 
با اینحا خیلی ممنون

البته من هیچ وقت چنین اشتباهی در مورد دیتابیس نمیکنم و فایلهای بیشتر از 100 کیلوبایت رو در دیتابیس نمیزارم
اما به سوال دوستمون دقت کنید؟
میخواد بدونه چه فیلدی مناسبه و من جواب این سوال رو دادم 
من نمیخواستم صورت مساله رو عوض کرده باشم...................

----------


## SabaSabouhi

> ببخشید فکر کردم اسمتون صبا هست 
> با اینحا خیلی ممنون
> 
> البته من هیچ وقت چنین اشتباهی در مورد دیتابیس نمیکنم و فایلهای بیشتر از 100 کیلوبایت رو در دیتابیس نمیزارم
> اما به سوال دوستمون دقت کنید؟
> میخواد بدونه چه فیلدی مناسبه و من جواب این سوال رو دادم 
> من نمیخواستم صورت مساله رو عوض کرده باشم...................


سلام دوست عزیز
1. خوب بله، اسمم «صبا» هست. این اسم فقط برای خانم‌ها استفاده نمی‌شه.
2. به پرسش دوستمون دقت کردم، ایشون اول پرسیدن، "آیا می‌شه از SQL استفاده کرد؟"
3. به این عوض کردن صورت مساله نمی‌گن، عوض کردن راه حل می‌گن.
استفاده از SQL برای ذخیره سازی، راه حل هست نه صورت مساله.
به نظر من این راه حل اشتباه هست و لازم می‌دونم وقتی پاسخ می‌دم این اشتباه رو
به دوستمون تذکر بدم.
این سایت برای همین درست شده، اینطور نیست؟

صبا صبوحی

----------


## pezhvakco

اگه با SQL 2008 به بالاتر کار میکنید =>
من "دو" روش برای نگهداری و مدیریت فایل ها در SQL بکار میبرم که شاید بکار شما هم بیاید :

1) File Stream
2) File Table

1)در SQL 2008 روش تازه بیان شد که در زمان خودش روشی خوب بود و از خوبی های اون میشه به 
الف) سیستم transaction مختص به خود را داشته => از رشد غیر منطقی transaction log پایگاه داده جلوگیری میکرد.
ب) هنگام به روز رسانی ستون هایی با این ساختار (ایجاد و پاک کردن) هدف فقط کار روی همین  فایل ها را خواستار هستیم => بنابراین از هم پاشیدگی داده ها (fragmentation ) در این روش  بسیار کمتر از روش بکاربردن از ستون هایی با ساختار varbinary(max) می‌باشد.
ج) بکارگیری ابزار خود ویندوز (سیستم پیکربندی NTFS) و  NT system cache جهت کش کردن داده ها که سبس بالا بردن بازدهی پایگاه داده خواهد شد.
د) ازاد بودن  buffer pool خود موتور اس کیوال سرور برای کارهای روزمره‌ی SQL.
ه) محدودیت 2GB فیلدهایی از نوع varbinary(max) با توجه به ذخیره سازی این نوع BLOBs در فایل سیستم، دیگر وجود نخواهد داشت.


2) ابزار و روشی تازه که در SQL2012 گنجانده شده است و میگن پیشرفت داده شده همون File Stream + بکارگیری  hierarchyid و فایل سیستمی خود ویندوز در مدیریت فایل ها است .

هر دو روش چند تایی هم خوبی و بدی دیگه دارند که اگه خواستین میتونید اون ها رو هم بدونید .

----------

