File Stream Nedir

File Stream yapısı, varbinary(MAX) BLOB nesneleri(doküman, resim, video vb.) sunucu üzerindeki NTFS File system üzerinde veritabanı ile bütünleşik yapıda tutar. File system üzerinde file stream dosyaları oluşturur ve bu dosyaları veritabanının bir parçası yapar. Blob nesneleri NTFS file system’de file stream yapıda tutmak yerine, tabloda varbinary(MAX) veri tipini kullanarak veritabanının içine de gömebiliriz. 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.)

 

BLOB nesneleri File Stream kullanarak file system üzerinde tuttuğumuzda sanki veritabanının içindeymiş gibi tsql ile insert, update ve delete yapabiliyoruz. Ayrıca full backup aldığımız zaman, file stream verinin de backup’ını almış oluyoruz.

 

File Stream yapısının ne olduğunu daha açık bir şekilde anlatmak için FileStream kullanan bir veritabanı oluşturalım.

 

Öncelikle instance seviyesinde File Stream’i enable etmemiz gerekir. SQL Server Configuration Manager’ı açarak SQL Server Services kısmına geliyoruz ve sağ tarafta file stream’i enable etmek istediğimiz instance üzerinde sağ tıklayarak properties diyoruz.

 

 

 

Açılan ekranda FILESTREAM tab’ına geliyoruz ve Enable FILESTREAM for Transact-SQL access seçeneğini seçerek ok diyoruz.

 

Enable FILESTREAM for Transact-SQL access seçeneği file stream veriye transact sql erişimi için izin verdiğimiz anlamına geliyor.

 

Enable FILESTREAM for file I/O access seçeneği ise filestream için bir şeyi değiştirmez. Bu özelliği aktifleştirdiğinizde File Table’lara Windows üzerinden bir share gibi erişebilirsiniz. “File Table Nedir ve File Stream’den Farkları Neler” isimli makaleyi okumanızı öneririm.

 

Allow remote clients access to FILESTREAM data seçeneği ise file stream verisine uzak bilgisayarlardan erişim için izin vermemizi sağlıyor. Bu seçeneği de aktif etmenizi güvenlik gereği önermiyorum.

 

 

 

Daha sonra aşağıdaki script yardımıyla sp_configure üzerinden filestream’i açıyoruz. Sp_configure üzerinden yapılabilecek diğer işlemler için “sp_configure(SQL Server’da Server Seviyesinde Konfigurasyonlar)” isimli makalemi okumak isteyebilirsiniz.

 

EXEC sys.sp_configure N'filestream access level', N'1'
GO
RECONFIGURE WITH OVERRIDE
GO

 

Aynı işlemi instance üzerinde sağ tıklayarak properties dedikten sonra Advanced sekmesinden FILESTREAM Access Level’den Transact-SQL access enabled seçeneğini seçerek de gerçekleştirebiliriz.

 

 

 

Bu işlemler bittikten sonra SQL Server Configuration Manager üzerinden SQL Server’ı restart etmemiz gerekiyor.

 

SQL Server Configuration Manager Ayarları” isimli makalemde Configuration Manager üzerinden yapılabilecek diğer işlemleri görebilirsiniz.

 

FileStream kullanan bir veritabanı oluşturmak:

 

SSMS üzerinde Instance’ın altında Databases sekmesinde sağ tıklayarak aşağıdaki gibi New Database… diyoruz.

 

 

 

Öncelikle FileStream içermeden normal bir veritabanını aşağıdaki gibi oluşturalım. Veritabanı oluşturmak basit bir iş gibi gözükebilir fakat büyük sistemler için default değerlerle veritabanı oluşturursanız sonrasında başınız çok ağrıyacaktır. Bu yüzden “Veritabanı Oluşturmak Deyip Geçmeyin!” isimli makalemi okumanızı tavsiye ediyorum.

 

 

 

 

Veritabanını oluşturduktan sonra SSMS üzerinde veritabanına sağ tıklayarak properties diyoruz ve Filegroups sekmesinden aşağıda gördüğünüz gibi Add Filegroup diyerek filegroup’a bir isim veriyoruz. Ben FILESTREAMGROUP ismini verdim.

 

 

 

File Stream için bir filegroup oluşturduktan sonra veritabanına SSMS üzerinden tekrar sağ tıklıyoruz ve properties diyoruz.

 

Daha sonra aşağıdaki ekrandan Add diyerek Logical Name’ bir isim veriyoruz. Ben FileStreamVeri ismini verdim.

 

File Type kısmından FILESTREAM Data seçeneğini seçiyoruz.

 

Filegroups kısmından da, daha önce oluşturduğumuz FILESTREAMGROUP filegroup’unu seçiyoruz.

 

Path kısmındanda File Stream verinin konumlanacağı diski ve klasörü seçerek ok diyoruz.

 

 

 

Bu oluşturduğum veritabanının create script’ini almak için aşağıdaki gibi veritabanı üzerinde sağ tıklayarak Script Database as-> Create to->New query editor diyebilirsiniz.

 

 

Veritabanının create script’i aşağıdaki gibidir:

USE [master]
GO
CREATE DATABASE [FileStreamDB]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'FileStreamDB', FILENAME = N'C:\MSSQL\FileStreamDB.mdf' , SIZE = 262144KB , MAXSIZE = UNLIMITED, FILEGROWTH = 262144KB ),
 FILEGROUP [FILESTREAMGROUP] CONTAINS FILESTREAM  DEFAULT
( NAME = N'FileStreamVeri', FILENAME = N'C:\MSSQL\FileStreamVeri' , MAXSIZE = UNLIMITED)
 LOG ON
( NAME = N'FileStreamDB_log', FILENAME = N'C:\MSSQL\FileStreamDB_log.ldf' , SIZE = 262144KB , MAXSIZE = 2048GB , FILEGROWTH = 262144KB )
GO
ALTER DATABASE [FileStreamDB] SET COMPATIBILITY_LEVEL = 120
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [FileStreamDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [FileStreamDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [FileStreamDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [FileStreamDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [FileStreamDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [FileStreamDB] SET ARITHABORT OFF
GO
ALTER DATABASE [FileStreamDB] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [FileStreamDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [FileStreamDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [FileStreamDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [FileStreamDB] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [FileStreamDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [FileStreamDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [FileStreamDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [FileStreamDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [FileStreamDB] SET  DISABLE_BROKER
GO
ALTER DATABASE [FileStreamDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [FileStreamDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [FileStreamDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [FileStreamDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [FileStreamDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [FileStreamDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [FileStreamDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [FileStreamDB] SET RECOVERY FULL
GO
ALTER DATABASE [FileStreamDB] SET  MULTI_USER
GO
ALTER DATABASE [FileStreamDB] SET PAGE_VERIFY CHECKSUM 
GO
ALTER DATABASE [FileStreamDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [FileStreamDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [FileStreamDB] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
ALTER DATABASE [FileStreamDB] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [FileStreamDB] SET  READ_WRITE
GO

 

Veritabanını oluşturduktan sonra sıra file stream veri içeren tablo oluşturmaya geldi.

 

Aşağıdaki script yardımıyla tabloyu oluşturuyoruz.

 

USE FileStreamDB
GO
CREATE TABLE FileStreamOrnekTablo
(
[ID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[DocumanAdi] varchar(500),
[DokumanDetay] VARBINARY(MAX) FILESTREAM NULL
)
GO

 

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 1

A table that has FILESTREAM columns must have a nonnull unique column with the ROWGUIDCOL property.

 

FileStream veri içeren bir veritabanının backup ve restore işlemini normal backup restore işlemleri gibi yapabiliriz.

 

FileStream veri içeren bir veritabanının detach ve attach işlemlerini yapmak için “FileStream Veri İçeren Veritabanının Detach ve Attach Edilmesi” isimli makalemden faydalanabilirsiniz.

Loading

Leave Your Comment