آشنایی با FileTable در SQL Server 2012 بخش 2
نویسنده: حامد قنادی
تاریخ: ۱۳۹۲/۰۲/۱۸ ۱۵:۳۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
ستون parent_path_locator نتیجهی فراخوانی تابع (GetAncestor(1 در ستون path_locator است که جهت به دست آوردن پوشهی پدر یک فایل و پوشه استفاده میشود. ستون file_type که از مقدار رشتهای ستون name تجزیه شده است، پسوند فایل را برمیگرداند. و ستون cached_file_size اندازهی بایت ذخیرهشده ستون file_stream را برمیگرداند. با این ساختار ثابت در اینجا، هر FileTable هر آنچه از File System نیاز دارید در یک پوشهی اشتراکی به شما میدهد.
این یعنی نمایش بیواسطه FileTable به هر کاربر یا برنامه. به طوری که برای نمایش یا بهروزرسانی جدول میتوانید از روش استاندارد I/O مانند کشیدن و رهاکردن با Windows Explorer یا برنامهنویسی با System.IO.FileStream و APIهای ویندوز استفاده کنید. اینچنین:
- ایجاد یک فایل یا پوشه در سیستم فایل -> افزودن یک ردیف به جدول
- افزودن یک ردیف به جدول -> ایجاد یک فایل یا پوشه در سیستم فایل
با کپی فایلها در مسیر بالا، به صورت خودکار رکوردهای زیر در جدول PhotoTable در پایگاهدادهها افزوده میشود:
به طور خلاصه پیش از این برای افزودن به FileStream دو راه کار پیش رو داشتید. یکی استفاده از T-SQL و دیگر sqlFileStream اکنون SQL Server 2012 راه کار سوم را پیشنهاد میکند. استفاده از File System در این روش FileStream به طور خودکار پر میشود.
پیش از ساخت یک FileTable بیان این نکته دارای اهمیت است که با کپی فایلها و پوشهها هیچ چیز جدیدی به NTFS افزوده نمیشود بلکه محتوای فایل به FileStream افزوده میشود و SQL Server با بررسی همزمان FileStream و FileTable نمایشی از ردیفهای FileTable به صورت یک پوشهی اشتراکی نشان میدهد. این نکته پاسخی به این پرسش خواهد بود که آیا با استفاده از FileTable حجم پایگاهدادهها دو برابر خواهد شد و در نتیجه دشواریها و چالشهای نگهداری و پشتیبانی را پیش رو خواهیم داشت!؟ که پاسخ "خیر" خواهد بود.
ایجاد یک FileTable
پیش از این در همین تارنما، روش فعال کردن FileStream در SQL Server را آموزش دیده اید. اگر درست به خاطر داشته باشید، چیزی شبیه به دستورهای زیر بود:
CREATE DATABASE MyFileArchive ON PRIMARY (NAME = MyFileArchive_data, FILENAME = 'C:\Demo\MyFileArchive_data.mdf'), FILEGROUP FileStreamGroup CONTAINS FILESTREAM (NAME = PhotoFileLibrary_blobs, FILENAME = 'C:\Demo\MyFiles') LOG ON (NAME = PhotoFileLibrary_log, FILENAME = 'C:\Demo\MyFileArchive_log.ldf')
FileTable به FileStream متکی است؛ بر این پایه پیش از ایجاد یک FileTable باید FileStream را روی پایگاهدادهها فعال کنیم. این کار با یک تعریف درست توسط بند FILEGROUP…CONTAINS FILESTREAM انجام میشود.
برای ایجاد FileTable تنها کافی است که بند WITH FILESTREAM را به دستور CREATE DATABASE بیفزایید. (یا برای فعالکردن FileTable روی یک پایگاهدادهی ساخته شده بند SET FILESTREAM را در دستور ALTER DATABASE بنویسید.) در این بند، از DIRECTORY_NAME برای نامگذاری یک پوشه برای پایگاهدادهها استفاده میکنیم. این پوشه در یک پوشه ریشه به نام SQL Server instance نمایش داده خواهد شد. بخش دوم بند NON_TRANSACTED_ACCESS=FULL است که دسترسی غیرتراکنشی را فعال میکند. با این کار برای هر FileTable در پایگاه داده یک زیرپوشه درون پوشهای که به نام DIRECTORY_NAME نامگذاری شده است؛ ساخته میشود.
با توجه به آنچه گفته شد برای ایجاد یک پایگاهداده با امکان ساخت FileTable دستورهای زیر را اجرا کنید:
CREATE DATABASE MyFileArchive ON PRIMARY (NAME = MyFileArchive_data, FILENAME = 'C:\Demo\MyFileArchive_data.mdf'), FILEGROUP FileStreamGroup CONTAINS FILESTREAM (NAME = PhotoFileLibrary_blobs, FILENAME = 'C:\Demo\MyFiles') LOG ON (NAME = PhotoFileLibrary_log, FILENAME = 'C:\Demo\MyFileArchive_log.ldf') WITH FILESTREAM (DIRECTORY_NAME='FilesLibrary', NON_TRANSACTED_ACCESS=FULL)
USE MyFileArchive GO CREATE TABLE PhotoTable AS FileTable GO
دنباله دارد ...