PDA

View Full Version : چرا فایل هایی که بصورت FileStream به SQL میفرستم با اسامی نامفهوم ذخیره میشه



mmbguide
چهارشنبه 04 مهر 1397, 07:18 صبح
سلام.


دارم با FileTable کار میکنم و مطالب این سایت رو خوندم

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

148973

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

148974

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


تشکر

mmbguide
یک شنبه 02 دی 1397, 16:39 عصر
دوستان کسی نمیتونه کمکم کنه...

SardareEshgh
یک شنبه 02 دی 1397, 19:54 عصر
سلام. کاش کدهای خودت رو هم میذاشتی شاید دوستان بتونن کمک کنن

mmbguide
دوشنبه 03 دی 1397, 09:49 صبح
سلام

ابتدا در 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
دوشنبه 03 دی 1397, 09:58 صبح
جدای مشکل بالا چندین سوال دیگه هم داشتم:



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


تشکر

SardareEshgh
دوشنبه 03 دی 1397, 17:22 عصر
این لینک رو ببینید کمکتون میکنه؟
https://programming.tosinso.com/articles/35794/%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A8%D8%A7%D9%86%DA%A9-%D9%87%D8%A7%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-filestream-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-(%D8%A8%D8%AE%D9%80%D9%80%D9%80%D9%80%D9%80%D8%B4-%D8%A7%D9%88%D9%84)

mmbguide
دوشنبه 03 دی 1397, 21:41 عصر
من هم به نوعی همین شکلی کار کردم. لینک بالا کار با فایل بصورت FileStream هستش و نتیجه هم درسته ولی در FileTable فایل های با نام خودشان ذخیره میشوند و باید بتوان Directory تولید کرد که در نمونه خودم این مورد بوجود نمیاد.

mmbguide
شنبه 29 دی 1397, 15:55 عصر
مسئله اول که در خصوص FileTable و FileStream هستش هنوز موفق نشدم حلش کنم.

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

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

hamid_hr
یک شنبه 30 دی 1397, 12:17 عصر
جدای مشکل بالا چندین سوال دیگه هم داشتم:



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


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

mmbguide
سه شنبه 02 بهمن 1397, 22:22 عصر
مکلم با نام فایل نیست. هدفم از تفکیک جداول این بود که سه گروه متفاوت فایل دارم و به دلیل حجم بالای فایل ها میخوام هر گروه رو روی یک هارد جداگانه ذخیره کنم.

hamid_hr
پنج شنبه 04 بهمن 1397, 11:58 صبح
مکلم با نام فایل نیست. هدفم از تفکیک جداول این بود که سه گروه متفاوت فایل دارم و به دلیل حجم بالای فایل ها میخوام هر گروه رو روی یک هارد جداگانه ذخیره کنم.
سه جدول جدا توی یک دپیتابیس بساز
هر جدول رو به یک فایل گروپ نسبت بده
هر فایل گروپ رو روی یک هارد بساز

mmbguide
جمعه 05 بهمن 1397, 17:49 عصر
من جداول رو ساختم ولی دیگه فایل ذخیره نمیشه. از نمونه کد زیر استفاده کردم:

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
جمعه 05 بهمن 1397, 18:25 عصر
آقا درست شد و الان داره جواب میده. فقط یه مشکلی دارم. زمانی که در قسمت File برای بار اول مسیر تعریف میکنم و پنجره رو میبندم و مجدد باز میکنم دیگه امکان تغییر Path وجود نداره. اگر میشه در این خصوص راهنمایی کنید. اصلا بطور کل میخوام بدونم چطور میشه Location رو بعد از ذخیره کلی فایل تغییر داد. تشکر

mmbguide
دوشنبه 22 بهمن 1397, 12:50 عصر
سلام.

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



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


ممنون

Mahmoud.Afrad
سه شنبه 23 بهمن 1397, 18:05 عصر
مسئله اول که در خصوص FileTable و FileStream هستش هنوز موفق نشدم حلش کنم.

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

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

میتونید چند Data Container و یا چند فایل گروپ داشته باشید. نیازی به چند جدول نیست.
https://dba.stackexchange.com/questions/162114/multiple-filegroups-vs-multiple-files-in-a-single-filegroup
https://www.sqlshack.com/sql-server-filestream-queries-and-filegroups
https://www.sqlshack.com/sql-server-filestream-queries-and-filegroups

mmbguide
سه شنبه 23 بهمن 1397, 20:28 عصر
تشکر. اگر در مورد پست #14 هم راهنمایی کنید ممنون میشم

mmbguide
چهارشنبه 24 بهمن 1397, 13:52 عصر
دوستان به یه مشکلی برخوردم. برحسب اشتباه محتویات پوشه ای که به عنوان Path در File انتخاب کرده بودم رو پاک کردم و الان جلوی بانک اطلاعاتیم عبارت Recovery Pending نوشته و دسترسی به بانک اطلاعاتیم ندارم.

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

ممنون

Mahmoud.Afrad
پنج شنبه 25 بهمن 1397, 00:26 صبح
دوستان به یه مشکلی برخوردم. برحسب اشتباه محتویات پوشه ای که به عنوان Path در File انتخاب کرده بودم رو پاک کردم و الان جلوی بانک اطلاعاتیم عبارت Recovery Pending نوشته و دسترسی به بانک اطلاعاتیم ندارم.

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

ممنون

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

Mahmoud.Afrad
پنج شنبه 25 بهمن 1397, 00:31 صبح
سلام.

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



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


ممنون

https://docs.microsoft.com/en-us/sql/relational-databases/blob/move-a-filestream-enabled-database?view=sql-server-2017

mmbguide
جمعه 26 بهمن 1397, 17:12 عصر
فایل filestream.hdr درون پوشه را ریکاوری کنید و برگردانید داخل پوشه و سرویس اسکیول را ریستارت کنید.

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

Mahmoud.Afrad
جمعه 26 بهمن 1397, 21:14 عصر
منظورتون از ریکاوری، همون بازیابی فایل های حذف شده هستش یا سازوکاری در SQL برای اینکار وجود داره؟ اگه بازیابی فایل حذف شده هستش فرض کنیم فایل مورد نظر بازیابی نشه، اونوقت تکلیف چیه؟ یعنی تمام فایل های ذخیره شده از بین میرن؟

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

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

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

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

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

mmbguide
چهارشنبه 08 اسفند 1397, 16:12 عصر
سلام. تا آخر همین هفته یه نمونه ساه برات آماده میکنم.

mmbguide
جمعه 17 اسفند 1397, 08:37 صبح
سلام. مطابق آنچه که در ابتدای همین تاپیک گفته شده عمل کنید. در حقیقت در زمان ذخیره سازی اطلاعات باید مشابه همون حالتی که برای اطلاعات معمولی در SQL عمل می کنید کار رو انجام بدید. درواقع کدهای ساده که در پست های بالا اومده جواب میده. البته سعی میکنم حتما یک نمونه آماده کنم. بنابه مشکلات فعلا موفق نشدم که نمونه برایتان آماده کنم ولی بزودی براتون تهیه میکنم.

mmbguide
چهارشنبه 08 خرداد 1398, 15:50 عصر
سلام. با توجه به راهنمایی دوستان در حال حاضر دارم با 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
چهارشنبه 08 خرداد 1398, 17:38 عصر
در لینکی که چند پست قبل (http://barnamenevis.org/showthread.php?551386-%DA%86%D8%B1%D8%A7-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%D8%A8%D8%B5%D9%88%D8%B1%D8%AA-FileStream-%D8%A8%D9%87-SQL-%D9%85%DB%8C%D9%81%D8%B1%D8%B3%D8%AA%D9%85-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%A7%D9%85%DB%8C-%D9%86%D8%A7%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D9%85%DB%8C%D8%B4%D9%87&p=2410552&viewfull=1#post2410552) ارسال کردم توضیح داده شده.

mmbguide
پنج شنبه 09 خرداد 1398, 06:38 صبح
مرسی آقای Mahmoud.Afrad