# پایگاه‌های داده > SQL Server > T-SQL >  چرا فایل هایی که بصورت FileStream به SQL میفرستم با اسامی نامفهوم ذخیره میشه

## mmbguide

سلام.


دارم با FileTable کار میکنم و مطالب این سایت رو خوندم
http://www.sqlservercentral.com/articles/T-SQL/109437/نتیجه راهنمای بالا باید تصویر زیر باشه

ضمیمه 148973

ولی نتیجه کار من بصورت زیر شده

ضمیمه 148974

کسی میتونه راهنمایی کنه. مرجعی هست که در این خصوص کامل توضیح داده باشه؟
درضمن مطابق راهنمای سایت، دستور ساخت SubDirectory به درستی در SQL کار میکنه ولی در Explorer ویندوز هیچ پوشه ای رو نمیبینم که اضافه شده باشد.


تشکر

----------


## mmbguide

دوستان کسی نمیتونه کمکم کنه...

----------


## SardareEshgh

سلام. کاش کدهای خودت رو  هم میذاشتی شاید دوستان بتونن کمک کنن

----------


## mmbguide

سلام

ابتدا در SQL Server Configuration Manager گزینه Enable FileStream رو به همراه سایر گزینه های این بخش فعال کردم

ضمیمه 149490

در SQL Server Management گزینه FileStream Access Level را برابر Full Access Enabled قرار دادم.

پس از اون تنظیم بانک اطلاعاتی رو به شکل زیر انجام داده:
ابتدا در ّFileGroups
ضمیمه 149491

تنظیمات بخش Files
ضمیمه 149492

تنظیمات بخش Options
ضمیمه 149493

در انتها با کدهای زیر جدول رو ایجاد کردم  و جدول ایجاد شد

USE TestFT
GO


CREATE TABLE tblFT AS FILETABLE
  WITH
  (
    FILETABLE_DIRECTORY = 'TestFT_FT',
    FILETABLE_COLLATE_FILENAME = database_default
  )
GO


با استفاده از StoredProcedure زیر فایل رو ذخیره میکنم

CREATE PROCEDURE SaveFile
	    -- Add the parameters for the stored procedure here
	    @FileStream VARBINARY(max),
	    @FileName NVARCHAR(150)
    AS
    BEGIN
	    -- SET NOCOUNT ON added to prevent extra result sets from
	    -- interfering with SELECT statements.
	    SET NOCOUNT ON;


	   INSERT INTO tblFT (file_stream,name,is_directory,is_archive) VALUES (@FileStream,@FileName, 1, 0);


    END
GO



کد زیر هم مربوط میشه به VB.NET


        Dim FS As Byte()
        Dim FN As String


        FS = IO.File.ReadAllBytes("D:\TestFT.txt")
        FN = "TestFT"
        bal.SaveFile(FS, FN)


تصویر زیر پس از ذخیره فایل
ضمیمه 149494

این هم نتیجه ذخیره فایل در هارد دیسک
ضمیمه 149495

ممنون میشم اگر دوستان راهنمایی کنند

----------


## mmbguide

جدای مشکل بالا چندین سوال دیگه هم داشتم:


اگر قرار باشه تعداد بسیار زیادی فایل در سرور ذخیره بشه ایا ذخیره همه فایل ها در یک Directory مشکل ساز نیست؟ کند شدن سیستم و مسائل دیگه ای که شاید به ذهن من نرسهمثلا برنامه بخشی داره که هر کاربر میتونه اطلاعات خودشو آپلود کنه و گزارش تصویری در برنامه بصورت عکس ذخیره کنه حالا اگر 10 کاربر هرکدوم عکسهایی با نام های مشابه داشته باشند SQL نام های مشابه قبول نمیکنه و خطا میده. برای این چه راه حلی وجود داره؟ منظورم ذخیره فایل با اسامی مشابه هست.

تشکر

----------


## SardareEshgh

این لینک رو ببینید کمکتون میکنه؟
https://programming.tosinso.com/arti...7%D9%88%D9%84)

----------


## mmbguide

من هم به نوعی همین شکلی کار کردم. لینک بالا کار با فایل بصورت FileStream هستش و نتیجه هم درسته ولی در FileTable فایل های با نام خودشان ذخیره میشوند و باید بتوان Directory تولید کرد که در نمونه خودم این مورد بوجود نمیاد.

----------


## mmbguide

مسئله اول که در خصوص FileTable و FileStream هستش هنوز موفق نشدم حلش کنم.

اما در خصوص اینکه فایل های مختلف رو بتونم در پارتیشن های مختلف ذخیره کنم یه راه حل به ذهنم رسید و اون اینه که به ازای هر گروه از فایل های برنامه که حدود 3 گروه اصلی هستند، 3 بانک اطلاعاتی مجزا ایجاد کنم و هر بانک اطلاعاتی تنها حاوی یک جدول FileStream خواهد بود و در زمان ارسال فایل کافیه که فایل رو به بانک خودش ارسال کنم.

ممنون میشم اگر دوستان نظر بدند

----------


## hamid_hr

> جدای مشکل بالا چندین سوال دیگه هم داشتم:
> 
> 
> اگر قرار باشه تعداد بسیار زیادی فایل در سرور ذخیره بشه ایا ذخیره همه فایل ها در یک Directory مشکل ساز نیست؟ کند شدن سیستم و مسائل دیگه ای که شاید به ذهن من نرسهمثلا برنامه بخشی داره که هر کاربر میتونه اطلاعات خودشو آپلود کنه و گزارش تصویری در برنامه بصورت عکس ذخیره کنه حالا اگر 10 کاربر هرکدوم عکسهایی با نام های مشابه داشته باشند SQL نام های مشابه قبول نمیکنه و خطا میده. برای این چه راه حلی وجود داره؟ منظورم ذخیره فایل با اسامی مشابه هست.
> 
> تشکر


1 رو نمیدونم
2 خود sql server  اسامی فایل ها رو تغییر میده و نام یونیک میزاره. نام ها تکراری نیستند . شما باید تو جداول نام فایل رو ذخیره کنید

----------


## mmbguide

مکلم با نام فایل نیست. هدفم از تفکیک جداول این بود که سه گروه متفاوت فایل دارم و به دلیل حجم بالای فایل ها میخوام هر گروه رو روی یک هارد جداگانه ذخیره کنم.

----------


## hamid_hr

> مکلم با نام فایل نیست. هدفم از تفکیک جداول این بود که سه گروه متفاوت فایل دارم و به دلیل حجم بالای فایل ها میخوام هر گروه رو روی یک هارد جداگانه ذخیره کنم.


سه جدول جدا توی یک دپیتابیس بساز
هر جدول رو به یک فایل گروپ نسبت بده
هر فایل گروپ رو روی یک هارد بساز

----------


## mmbguide

من جداول رو ساختم ولی دیگه فایل ذخیره نمیشه. از نمونه کد زیر استفاده کردم:

CREATE TABLE [tblFiles]
( FileId UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL UNIQUE DEFAULT(NEWID()),
Title NVARCHAR(255) NOT NULL,
SystemFile VARBINARY(MAX) FILESTREAM NULL )
ON [PRIMARY] FILESTREAM_ON [fsg1]



من در خط آخر در هر جدول از نام Filegroup استفاده کردم. نمیدونم روشم درست بوده یا خیر؟

----------


## mmbguide

آقا درست شد و الان داره جواب میده. فقط یه مشکلی دارم. زمانی که در قسمت File برای بار اول مسیر تعریف میکنم و پنجره رو میبندم و مجدد باز میکنم دیگه امکان تغییر Path وجود نداره. اگر میشه در این خصوص راهنمایی کنید. اصلا بطور کل میخوام بدونم چطور میشه Location رو بعد از ذخیره کلی فایل تغییر داد. تشکر

----------


## mmbguide

سلام.

الان من دو تا جدول دارم که فایل های رو در دو درایو مجزا ذخیره میکنه. اما حالا میخوام بانک اطلاعاتیم رو ببرم روی سیستم دیگه Attach کنم. اما چند مشکل وجود داره:


من اطلاعات یک جدول رو حذف کردم و هیچ رکوردی وجود نداره و همچنین از Shrink > File رو هم اجرا کردم ولی همچنان فضای اشغال شده دارم. البته از نظر SQL و اجازه نمیده در تنظیمات بانک اطلاعاتیم File ایجاد شده به عنوان FileStream رو حذف کنم.در چنین شرایطی که طراحی بانک در کامپیوتر خودم انجام شده و باید به یک سیستم دیگه ای انتقال پیدا کنه باید چکار کرد؟ چون در سیستم بعدی در زمان Attach کردن اگر مسیرهای انتخاب شده وجود ناشته باشند خطا میده.

ممنون

----------


## Mahmoud.Afrad

> مسئله اول که در خصوص FileTable و FileStream هستش هنوز موفق نشدم حلش کنم.
> 
> اما در خصوص اینکه فایل های مختلف رو بتونم در پارتیشن های مختلف ذخیره کنم یه راه حل به ذهنم رسید و اون اینه که به ازای هر گروه از فایل های برنامه که حدود 3 گروه اصلی هستند، 3 بانک اطلاعاتی مجزا ایجاد کنم و هر بانک اطلاعاتی تنها حاوی یک جدول FileStream خواهد بود و در زمان ارسال فایل کافیه که فایل رو به بانک خودش ارسال کنم.
> 
> ممنون میشم اگر دوستان نظر بدند


میتونید چند Data Container  و یا چند فایل گروپ داشته باشید.  نیازی  به   چند جدول نیست.
https://dba.stackexchange.com/questi...ngle-filegroup
https://www.sqlshack.com/sql-server-...and-filegroups
https://www.sqlshack.com/sql-server-...and-filegroups

----------


## mmbguide

تشکر. اگر در مورد پست #14 هم راهنمایی کنید ممنون میشم

----------


## mmbguide

دوستان به یه مشکلی برخوردم. برحسب اشتباه محتویات پوشه ای که به عنوان Path در File انتخاب کرده بودم رو پاک کردم و الان جلوی بانک اطلاعاتیم عبارت Recovery Pending نوشته و دسترسی به بانک اطلاعاتیم ندارم.

لطفا کمک کنید. چطور میتونم این مشکل رو حل کنم. البته با یک نرم افزار بانک رو Recovery کردم ولی وقتی به Properties میرم بخش FileGroup خاموشه.

ممنون

----------


## Mahmoud.Afrad

> دوستان به یه مشکلی برخوردم. برحسب اشتباه محتویات پوشه ای که به عنوان Path در File انتخاب کرده بودم رو پاک کردم و الان جلوی بانک اطلاعاتیم عبارت Recovery Pending نوشته و دسترسی به بانک اطلاعاتیم ندارم.
> 
> لطفا کمک کنید. چطور میتونم این مشکل رو حل کنم. البته با یک نرم افزار بانک رو Recovery کردم ولی وقتی به Properties میرم بخش FileGroup خاموشه.
> 
> ممنون


فایل filestream.hdr  درون  پوشه را  ریکاوری  کنید و برگردانید داخل پوشه و  سرویس اسکیول  را ریستارت کنید.

----------


## Mahmoud.Afrad

> سلام.
> 
> الان من دو تا جدول دارم که فایل های رو در دو درایو مجزا ذخیره میکنه. اما حالا میخوام بانک اطلاعاتیم رو ببرم روی سیستم دیگه Attach کنم. اما چند مشکل وجود داره:
> 
> 
> من اطلاعات یک جدول رو حذف کردم و هیچ رکوردی وجود نداره و همچنین از Shrink > File رو هم اجرا کردم ولی همچنان فضای اشغال شده دارم. البته از نظر SQL و اجازه نمیده در تنظیمات بانک اطلاعاتیم File ایجاد شده به عنوان FileStream رو حذف کنم.در چنین شرایطی که طراحی بانک در کامپیوتر خودم انجام شده و باید به یک سیستم دیگه ای انتقال پیدا کنه باید چکار کرد؟ چون در سیستم بعدی در زمان Attach کردن اگر مسیرهای انتخاب شده وجود ناشته باشند خطا میده. 
> 
> ممنون


https://docs.microsoft.com/en-us/sql...ql-server-2017

----------


## mmbguide

> فایل filestream.hdr  درون  پوشه را  ریکاوری  کنید و برگردانید داخل پوشه و  سرویس اسکیول  را ریستارت کنید.


منظورتون از ریکاوری، همون بازیابی فایل های حذف شده هستش یا سازوکاری در SQL برای اینکار وجود داره؟ اگه بازیابی فایل حذف شده هستش فرض کنیم فایل مورد نظر بازیابی نشه، اونوقت تکلیف چیه؟ یعنی تمام فایل های ذخیره شده از بین میرن؟

----------


## Mahmoud.Afrad

> منظورتون از ریکاوری، همون بازیابی فایل های حذف شده هستش یا سازوکاری در SQL برای اینکار وجود داره؟ اگه بازیابی فایل حذف شده هستش فرض کنیم فایل مورد نظر بازیابی نشه، اونوقت تکلیف چیه؟ یعنی تمام فایل های ذخیره شده از بین میرن؟


بله منظورم بازیابی فایل هست.

راه دیگر اینکه
اگر  از دیتابیس بکاپ   دارید یک دیتابیس جدید ایجاد و restore  کنید.

یا اینکه  
یک دیتابیس جدید  ایجاد  کنید.  دیتابیس  جدید را  offline کنید. از فایل های دیتابیس خراب یک کپی بگیرید و به محل فایلهای  دیتابیس جدید رفته  و جایگذین فایلهای  دیتابیس جدید کنید.   دیتابیس  جدید را online کنید.

----------


## رامین مرادی

> آقا درست شد و الان داره جواب میده. فقط یه مشکلی دارم. زمانی که در قسمت File برای بار اول مسیر تعریف میکنم و پنجره رو میبندم و مجدد باز میکنم دیگه امکان تغییر Path وجود نداره. اگر میشه در این خصوص راهنمایی کنید. اصلا بطور کل میخوام بدونم چطور میشه Location رو بعد از ذخیره کلی فایل تغییر داد. تشکر


سلام دوست عزیز منم کلی راجب همین فایل تیبل سرچ کردم و آخرگیج شدم. اگه در امکانتون هست و وقتشو دارید یه پروژه ساده  تک فرمه برای مثال ذخیره اسم و یه فایل اینجا بزارید ازش الگو بگیریم. نحوه فعال کردن فایل تیبل رو هم  بگید ممنون میشم

----------


## mmbguide

سلام. تا آخر همین هفته یه نمونه ساه برات آماده میکنم.

----------


## mmbguide

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

----------


## mmbguide

سلام. با توجه به راهنمایی دوستان در حال حاضر دارم با FileStream کار میکنم. حالا سوالم درخصوص تغییر آدرس FileStream هستش. برای تغییر آدرس اونطور که در سایت های مختلف جستجو کردم باید مراحل زیر به ترتیب انجام بشه:

حذف ستون Varbinary

ALTER TABLE Items DROP COLUMN ItemImage


قطع ارتباط FileStream با جدول

ALTER TABLE Items SET (FILESTREAM_ON = "NULL") 


حذف FileGroup

ALTER DATABASE NorthPole REMOVE FILE NorthPoleFS ;
ALTER DATABASE NorthPole REMOVE FILEGROUP NorthPoleFS ; 


خودم این روش را تست نکردم و سوالم اینه که با حذف ستون Varbinary چه اتفاقی برای فایل ها میوفته. چون جایی به این موضوع اشاره نکرده که فرض این باشه که حدود 2000 تا فایل در جدول ذخیره شده باشه و من هم فکر میکنم منظور نویسنده این بوده که جدول هنوز خالیه و هیچ رکوردی ندارد. حالا آیا با این کار و تغییر Path با وجود فایل hdr در مسیر تعریف شده آیا پس از ایجاد ستون جدید و اتصال FileStream جدید به جدول، میتونم از تمام فایل ها استفاده کنم یا خیر.

امیدوارم مطلب نامفهوم نبوده باشه. تشکر

----------


## Mahmoud.Afrad

در لینکی که چند پست قبل ارسال کردم توضیح داده شده.

----------


## mmbguide

مرسی آقای Mahmoud.Afrad

----------

