File Table Nedir ve File Stream’den Farkları Neler
File Table, File Stream’in teknolojisini kullanır. File sistem verilerini tablo olarak tutar. Yani diskteki verilere veritabanı içersinden erişebilirsiniz.
File Stream’den farklı olarak dizin hiyerarşisini veritabanında tutar.
File table’da file stream’deki gibi bir şema yapısı tanımlamazsınız. Şema yapısı kendisi direk oluşur ve değiştirilemez.
File Table’da da veriler windows üzerinden bir share gibi görüntülenebilir. Bunun için Configuration Manager üzerinden Enable FILESTREAM for file I/O access seçeneğini aktif hale getirmeniz gerekir. “File Stream Nedir” isimli makalede configuration manager üzeridnen bu ayarı nasıl yapacağınızı bulabilirsiniz. Bu özellik veritabanı seviyesinde aktif edilebilir.
File Table’da dosya özelliklerine(create date, modified date) veritabanı üzerinden erişebilirsiniz.
File Stream gibi dosya dizinlerinin ve dosyaların SQL içersinden tsql ile sorgulanmasına olanak verir.
File Stream’i ve File Table’ı bir arada kullanabilirsiniz.
File Table memory-mapped dosyaları desteklemez. Örneğin notepad ve paint memory mapped dosyaları kullanır. Bu uygulamaları file table ile birlikte aynı sunucuda kullanamazsınız. Fakat farklı bir sunucudan file table’ın içindeki dosyaları bu uygulamalaru kullanarak uzaktan açabilirsiniz.
Bir örnekle File Table’ı daha net anlayabileceğimizi düşünüyorum. Öncelikle FileTableDB isminde bir veritabanı oluşturalım. Veritabanı oluşturmak için “Veritabanı Oluşturmak Deyip Geçmeyin!” isimli makalemi okuyabilirsiniz.
Daha sonra File Stream’i aktif hale getirelim. “File Stream Nedir” isimli makaledeki adımların aynısını uygulamamız gerekiyor. Tablo oluşturma kısmına kadar geldikten sonra adımlarımız değişiyor.
Oluşturduğumuz veritabanı üzerinde sağ tıklayıp aşağıdaki gibi New File Table… dediğimizde bize File Table oluşturma script’ini veriyor.
Bu script’i kullanmak yerine aşağıdaki gibi daha hazır hale getirilmiş script’i kullanarak file table’ımızı oluşturuyoruz.
CREATE TABLE FileTableOrnek AS FileTable WITH ( FileTable_Directory = 'FileTableOrnek', FileTable_Collate_Filename = database_default ); GO
Eğer veritabanını oluştururken File Table için NON_TRANSACTED_ACCESS yönetmini ve DIRECTORY_NAME’i belirtmediyseniz aşağıdaki gibi hata alırsınız.
Msg 33414, Level 16, State 1, Line 2
FileTable objects require the FILESTREAM database option DIRECTORY_NAME to be non-NULL. To create a FileTable in the database ”, set the DIRECTORY_NAME option to a non-NULL value using ALTER DATABASE. Or, to set the DIRECTORY_NAME option to NULL, in the database ” disable or drop the existing FileTables.
Bu hatayı çözmek için aşağıdaki script’i çalıştırmalısınız.
--NON_TRANSACTED_ACCESS için READ_ONLY veya OFF seçenekleri de mevcut ALTER DATABASE FileTableDB SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileTableOrnek')
Script’i çalıştırdığınızda hata alıyorsanız aşağıdaki hale getirip veritabanını önce single user’a en son da multi user’a çekebilirsiniz.
ALTER DATABASE FileTableDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO --NON_TRANSACTED_ACCESS için READ_ONLY veya OFF seçenekleri de mevcut ALTER DATABASE FileTableDB SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N'FileTableOrnek') GO ALTER DATABASE FileTableDB SET MULTI_USER WITH ROLLBACK IMMEDIATE
Yukarıdaki file table oluşturma script’imizi tekrar çalıştırdığınızda bu sefer hata almadan tablonuzu oluşturabilirsiniz.
Daha sonra oluşturduğumuz File Table’a aşağıdaki gibi select çekebilirsiniz.
İlk etapta sonuç gelmeyecektir.
Aşağıdaki gibi file table’ın üzerine sağ tıklayarak Explore File Table Directory dediğinizde File Table için oluşturulan directory’e gidersiniz.
Bu directory’de bir şeyler oluşturup tabloya tekrar select çektiğinizde bu sefer her klasör ve dosya için tabloda bir satır oluşturduğunu göreceksiniz.