SQL Server FileStream, büyük boyutlu BLOB (Binary Large Object) verilerini (örneğin resimler, videolar, PDF dosyaları vb.) veritabanı dışında NTFS dosya sisteminde saklamaya olanak tanıyan bir özelliktir. Bu, özellikle büyük ve sık erişilen dosyalar için performansı artırmak ve veritabanı boyutunu yönetilebilir hale getirmek için kullanılır.
FileStream’in Temel Özellikleri
1. Normalde SQL Server’da BLOB verileri varbinary(MAX) ile saklanır ve bu veriler doğrudan veritabanında tutulur.
FileStream kullanıldığında, BLOB verileri fiziksel olarak NTFS dosya sisteminde saklanır ancak yine de SQL Server tarafından yönetilir.
2. FileStream ile saklanan dosyalar ACID (Atomicity, Consistency, Isolation, Durability) prensiplerine uygun olarak işlenir.
Yani, bu dosyalar da normal SQL Server işlemlerinde olduğu gibi transaction içinde yönetilebilir.
3. SQL Server’ın veri sayfaları maksimum 8 KB boyutundadır. Büyük dosyalar bu sayfalara bölünerek saklandığında performans düşer.
FileStream ile veriler doğrudan NTFS üzerinde saklandığından disk üzerindeki okuma/yazma işlemleri çok daha verimli hale gelir.
4. FileStream verileri TSQL sorguları ve TransactSQL işlemleri ile yönetilebilir.
5. FileStream ile saklanan veriler, Win32 API’leri aracılığıyla doğrudan erişilebilir. Bu, özellikle büyük dosyaların daha hızlı işlenmesine yardımcı olur.
Not: Eğer dosyalarınız genel olarak 1 MB’tan küçükse veritabanı üzerinde tutmanız performansı arttıracaktır. Bununla beraber BLOB verilerin boyutu büyük olduğu için veritabanı yönetimini zorlaştıracaktır.(Backup, DBCC CHECKDB,Restore vb.)
Not: Filestream veri içeren bir veritabanının backup restore işlemini normal backup restore işlemleri gibi yapabiliriz.
FileStream kullanabilmek için önce SQL Server’da bu özelliğin etkinleştirilmesi gerekir.
SQL Server Configuration Manager ekranında kurulu olan hangi servis üzerinde bu özelliğin aktif edilmesini istiyorsak ilgili servis seçilir. İlgili servise sağ tıklayıp properties ekranına girilir.

Gelen ekranda FileStream sekmesine gidilir ve Eğer instance üzerindeki veritabanlarından T-Sql komutlarıyla filestream veriye erişilecekse Enable FILESTREAM for TransactSQL access seçeneğini aktif edilir.

Gelen kavramların ne olduğuna değinelim.
Enable FILESTREAM for file I/O access’i seçerseniz dosyalara windows üzerinden de erişilebilmesine olanak vermiş olursunuz. Güvenlik anlamında bunu yapmanızı tavsiye edilmez. Çünkü “Enable FILESTREAM for file I/O access” seçeneğini işaretlerseniz, bu dosyalara sadece SQL Server içinden değil, aynı zamanda Windows dosya sistemi (NTFS) üzerinden de doğrudan erişim sağlanabilir.
Neden Tavsiye Edilmiyor?
- SQL Server’ın sağladığı veri güvenliği ve erişim kontrolü baypas edilebilir.
- Özellikle hassas veriler barındırıyorsanız (örneğin tıbbi belgeler, kişisel bilgiler), doğrudan dosya sistemi erişimi veri sızıntısı veya yetkisiz erişim riski taşır.
Allow remote clients access to FILESTREAM data’yı da seçerseniz uzak bilgisayarlardan da FILESTREAM verilerine erişimi sağlamanın yolunu açmış olursunuz. Güvenlik açısından önerilmemektedir.
Sadece aşağıdaki Enable FILESTREAM for Transact-SQL access i seçeneğini seçerek FILESTREAM verilerine sadece TSQL ile veritabanı üzerinden erişilebilmesini garanti altına almış oluyoruz.

Yukarıdaki değişikliklerden sonra servisi Restart etmemiz gerekmektedir. Yukarıdaki ekran resimlerindeki gibi arayüzden erişim yapabilirken aynı zamanda aşağıdaki komutlarla da aktif yapabiliriz.
Hem T-SQL hem de Windows dosya sistemi API’leri üzerinden erişim sağlanır.
EXEC sp_configure N'filestream access level', 2;
RECONFIGURE WITH OVERRIDE;
Sadece T-SQL üzerinde erişim yapmak istiyorsak 1 değeri kullanılmaktadır.
EXEC sp_configure N'filestream access level', 1;
RECONFIGURE WITH OVERRIDE;
Kısacası:
0: FileStream devre dışı.
1: Yalnızca TSQL erişimi açık.
2: Hem TSQL hem de dosya sisteminden erişim açık.
Eğer sadece SQL Server içinden (SELECT, INSERT, UPDATE, vb. ile) FileStream verilerini yönetmek istiyorsan, 1 kullanabilirsin.
Eğer uygulamalar veya dış sistemler (örneğin, .NET veya Windows API kullanarak dosyalara doğrudan erişmek) de FileStream içeriğine erişecekse, 2 kullanmalısın.
Yukarıdaki işlemlerin aynısını instance üzerine sağ tıklayıp properties ekranına giriyoruz. Gelen ekranda Advanced sekmesinde FILESTREAM bölümünde aktif edebiliriz.

Bir örnek üzerinden bir veritabanı ve bir tablo oluşturalım. Öncelikle FileStream verilerini saklayacak bir veritabanı oluşturmalıyız.
İlk olarak bir veritabanı oluşturuyoruz.

Veritabanına oluşturduktan sonra veritabanına sağ tıklayıp properties ekranından Filegroups bölümüne girilir. Gelen ekran FILESTREAM bölümünde file stream file group oluşturulur.

Yukarıda yapılan işlemin scripti:
USE [master]
GO
ALTER DATABASE [FILESTREAMDB] ADD FILEGROUP [StreamGroup] CONTAINS FILESTREAM
GO
CONTAINS FILESTREAM: Bu ifade, belirtilen dosya grubunun FileStream verilerini saklayacağını belirtir.
Yukarıdaki oluşumdan sonra veritabanının properties ekranından Files bölümüne tıklanır.

Yukarıdaki ekranda Add denilip filestream veriyi kaydedeceğimiz bir data file belirliyorum. Logical Nmae kısmında bir isim veriyoruz. File Type kısmında FILESTREAM Data seçeneğini seçiyoruz. Filegroup bölümünde oluşturduğum StreamGroup seçeneğini seçtikten sonra path kısmında verinin konumlanacağı disk yolunu belirtiyorum.
Not: Filestream verinin herhangi bir uzantısı olmaz. Yani mdf,ndf,ldf uzantısı olmaz.

Yukarıdaki ayarlamaları yaptıktan sonra işlemin scriptini alıp oluşturuyorum.
USE [master]
GO
ALTER DATABASE [FILESTREAMDB] ADD FILE ( NAME = N'StreamVeri', FILENAME = N'C:\FILESTREAM23\StreamVeri' ) TO FILEGROUP [StreamGroup]
GO
Şimdi bu veritabanında bir tablo oluşturalım:
use [FILESTREAMDB]
CREATE TABLE Documents
(
DocumentID UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,
FileData_Name NVARCHAR(255),
FileData VARBINARY(MAX) FILESTREAM
);
UNIQUEIDENTIFIER ROWGUIDCOL: FileStream için benzersiz bir kimlik gereklidir.
VARBINARY(MAX) FILESTREAM: FileStream olarak saklanacak veriyi belirler.
Not: Eğer tabloda uniqueidentifier tipinde bir kolon ROWGUIDCOL ve NOT NULL olarak bulunmassa tablo oluştururken aşağıdaki gibi hata alırsınız.
Msg 5505, Level 16, State 1, Line 9
A table that has FILESTREAM columns must have a nonnull unique column with the ROWGUIDCOL property.
3. FileStream ile Veri Ekleme ve Okuma
FileStream ile dosya ekleme:
INSERT INTO Documents (DocumentID, FileData_Name, FileData)
VALUES (NEWID(), 'ExampleFile', CAST('Sample data' AS VARBINARY(MAX)));
Burada ‘Sample data’ yerine gerçek bir dosyanın binary verisi eklenebilir.
FileStream verisini okuma:
SELECT FileData_Name, FileData
FROM Documents;

T-SQL kullanarak küçük binary veriler ekleyebilirsiniz (örneğin küçük bir resmin hex datası gibi):
INSERT INTO Documents (DocumentID, FileData_Name, FileData)
VALUES (NEWID(), 'ExampleFile.jpg', 0xFFD8FFE000104A464946000101...);
Ama bu yöntem büyük dosyalar için pratik değildir çünkü:
- Dosyayı elle hex formatına çevirmek gerekir.
- Boyutu büyük olursa SQL Server Management Studio (SSMS) bunu desteklemez.
Büyük dosyaları veritabanına eklemek için en uygun yöntem: .NET, PowerShell veya SSMS ile parametreli komutudur.
Aşağıdaki komut ile windows üzerinde filestream veri olmasına izin verir.
INSERT INTO Documents (DocumentID, FileData_Name, FileData)
SELECT NEWID(), 'resim.jpg',
BulkColumn
FROM OPENROWSET(BULK 'C:\Data\resim.jpg', SINGLE_BLOB) AS FileData;
FileStream Kullanmanın Avantajları ve Dezavantajları
Avantajları
NTFS dosya sistemi, büyük dosyaları yönetmek için optimize edilmiştir. FileStream, SQL Server’ın ACID uyumluluğunu destekler. Veritabanı sorgularıyla entegre çalışır. Büyük dosyalar Windows uygulamaları tarafından kolayca okunabilir.
Dezavantajları
FileStream’i etkinleştirmek ve kullanmak için ek ayarlar gerekir. FileStream içeren veritabanlarını yedeklerken dosya sisteminin de yedeğinin alınması gerekir. Eğer dosya boyutları küçükse, veritabanında saklamak daha pratik olabilir. Genelde 1 mb’dan düşük veritabanları veritabanı üzerinde saklamak daha mantıklıdır.
SQL Server FileStream, büyük BLOB verilerini veritabanı dışında NTFS üzerinde saklayarak performans artışı sağlar ve veritabanı boyutunu yönetilebilir hale getirir. Ancak, yapılandırılması geleneksel veritabanı depolama yöntemlerine kıyasla biraz daha karmaşıktır. Özellikle büyük boyutlu dosyalarla çalışan sistemlerde FileStream kullanımı büyük avantaj sağlar.
Bu makalede mssql server file stream yapısını detaylı bir şekilde görmüş olduk. Bir sonraki file stream Windows üzerinden veri nasıl çekilir görmüş olalım. Başka bir makalede görüşmek dileğiyle..
“Ey Rabbimiz! Herkesin hesaba çekileceği günde beni, ana babamı ve müminleri bağışla!”İbrahim-41