MS SQL은 2008 버전부터 Filestream 이라는 기능을 제공한다. 이 기능은 DB 내에 저장할 내용이 바이너리 파일이거나 대용량의 정보가 담길 때, DB 파일 내에 쌓는 대신 File로 저장할 수 있게 만드는 기능이다. 
(자세한 정보는 MS Doc에서 제공하는 https://docs.microsoft.com/en-us/sql/relational-databases/blob/filestream-sql-server?view=sql-server-ver15 문서를 참고하는 것이 도움이 될 것이다.)

그런데, MS SQL을 설치할 때, 기본값으로만 설치하게 되면, Filestream의 기능을 사용할 수 없다.
설치 중에 설정 관련된 사항이 나올 때, 이 Filestream에 대한 설정을 할 수 있게 제공하는데, 자세한 설정 방법을 모른다면, 이 부분을 보지도 못한채 넘어가게 된다.

만일 이런 경우 다음과 같이 활성화 할 수 있다.

1. SQL Server Configuration Manager를 실행.
정상적으로 설치된 경우 다음과 같은 메뉴에서 MS SQL Server Configuration Manager 라는 아이콘을 확인할 수 있는데, 이를 실행하면 된다.

실행했으면 자신의 MS SQL 서버의 서비스 항목에서 마우스 우클릭을 해 메뉴를 띄운 뒤, "Properties", 속성을 띄우도록 한다.

그러면 속성 창이 뜨는데, 여러가지 탭 중에 "FILESTREAM"을 선택하고, 안에 있는 체크를 모두 체크해주도록 한다. 

여기까지 완료되었다면, 이제 SQL Management Studio를 띄우도록 한다.
이번에는 FILESTREAM을 적용할 DB를 선택한 뒤, Properties로 들어가 속성창을 연다.

왼편 메뉴에서 "파일 그룹"을 선택한 다음 중앙에 위치한 FILESTREAM 항목에 파일 그룹을 추가하도록 한다. "이름" 부분에는 참조관계를 잡을 때 사용할 이름인데, 용도에 맞게 알기 쉽게 잡아주도록 한다. 저장소의 위치 선정을 위한 키 값같은 것으로 인지하면 된다. 기존에 쌓인 데이터가 많은 경우라면 모르겠지만, "읽기 전용"는 일단 빼고, "기본값"은 여러개의 FILESTREAM에 대한 파일 그룹이 있을 경우 기본 값(Default)를 정하는 부분이다. 최초 만든 항목이 기본적으로 기본 값으로 잡히게 된다.

다음에는 실제 파일 위치를 잡아주어야 한다. 이를 하기 위해서는 왼편에서 "파일" 메뉴를 열도록 한다. 
그러면 기존 DB의 데이터가 담기는 파일 위치와 로그 파일 위치를 설정하도록 되어 있는데, 그대로 두고, 대신 "추가"를 클릭한다.
그리고 난 뒤, 논리적인 이름에 적당한 이름을 넣고(보통 "_"을 추가해서 fs 혹은 filestream 등 표현), 파일 그룹을 앞에서 설정한 파일 그룹이름을 선택해서 넣도록 한다. 나머지는 그대로 둔 채 맨 뒤의 "경로" 부분에서 직접 저장될 파일들이 저장될 폴더를 설정한다. 이 폴더를 설정해야 데이터가 DB로 쌓이지 않고 이 위치에 저장되게 된다. 저장소 위치를 잘 잡아야, 파일이 쌓여 저장소의 부족이나 오류에 대한 대응이 어렵지 않으니, 저장 경로에 대한 설정을 꼭 주의를 해서 잡아주도록 한다.

지금까지가 DB에 대한 준비 작업이였고, 이제 부터가 제일 중요한 부분이다.
실제 FILESTREAM 기능을 사용할 테이블을 만들 때 방법이다. UI를 통해서 생성하기는 어렵고, 대신 SQL 문장을 이용해 Table을 생성해야 한다. 다른 컬럼(필드)는 기존의 방식과 동일하지만, 딱 두가지는 반드시 설정해주어야 한다.

1. RowId by GUID
GUID라고 해서, MS SQL 내에서는 uniqueidentifier 타입의 컬럼이다. 이 컬럼이 반드시 존재해야 한다. 보통 우리가 사용하는 int 혹은 numeric(18,0) 형태의 순차적으로 숫자가 올라가는 구조가 아니라, Guid를 이용해 만들어지는 값으로 사용된다. (보통 값이 CA53DC75-43C1-4879-A8AF-2BD10770A149 과 같은 형태로 제공). 보통 이 컬럼은 CREATE TABLE 안에 다음과 같은 형태로 만들어야 한다.

{컬럼이름} [uniqueidentifier] ROWGUIDCOL  NOT NULL UNIQUE DEFAULT NEWID(),


2. 데이터를 담을 컬럼
위에서는 해당 내용에 대한 고유 ID를 잡기 위한 컬럼이라면, 이번에는 실제 데이터가 저장되거나, 가져올 때 사용하게 되는 컬럼이다. varbinary 타입의 MAX 사이즈로 잡으면 되는데, 다만, 한가지 항목이 더 필요하다. FILESTREAM 이라는 키워드를 반드시 포함해야 한다. 해당 컬럼에 대한 쿼리는 아래와 같다.

{데이터컬럼 이름} [varbinary](max) FILESTREAM  NULL,


다만 이를 생성할 때 주의 할 점은, 쿼리 내에 "ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]" 항목이 없어야 한다. 
다음은 샘플로 생성할 때 다음과 같은 Table 구문으로 만들면 되며, 위에서 이야기한 2가지의 컬럼을 반드시 생성해야 한다. 그래야 정상적으로 테이블이 제작된다.

다음 쿼리는 예제 처럼 만들어서 실행한 테이블 생성 쿼리다.

CREATE TABLE [dbo].[TB_BASEINFO2](
	[id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
	[basename] [nvarchar](255) NOT NULL,
	[baseurl] [nvarchar](max) NOT NULL,
	[Itemguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL UNIQUE DEFAULT NEWID(),
	[ItemData] [varbinary](max) FILESTREAM  NULL
 CONSTRAINT [PK_TB_BASEITEM22] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) 
GO

 

728x90

+ Recent posts