Como criar e utilizar SQL Server FileTables: passo a passo
Guardar e gerir ficheiros (documentos, imagens) numa base de dados pode simplificar backups e permissões. As FileTables no SQL Server permitem armazenar ficheiros no sistema de ficheiros e, ao mesmo tempo, gerir metadados e permissões a partir do SQL Server, ideal para aplicações que misturam dados relacionais e ficheiros.
Pré-requisitos
- Instância de SQL Server 2012 ou superior com FILESTREAM habilitado.
- Permissões de administrador no servidor para alterar a configuração do SQL Server e criar pastas no servidor de ficheiros.
- SQL Server Management Studio (SSMS) ou cliente T-SQL.
Passo 1: Activar FILESTREAM ao nível do servidor
As FileTables dependem de FILESTREAM. Primeiro activamos o FILESTREAM nas propriedades do servidor e ao nível do serviço. Em SSMS: clicamos no nome do servidor → Properties → Advanced → habilitar "Enable FILESTREAM for Transact-SQL access" e, se necessário, "Allow remote client access". Depois reiniciamos o serviço SQL Server.
Passo 2: Configurar o servidor com T-SQL (opcional)
Também é possível configurar com T-SQL para garantir que está activo e configurado para acesso Transact-SQL e File I/O.
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'filestream access level', 2; -- 0=off,1=T-SQL,2=Full access
RECONFIGURE;
Passo 3: Criar uma base de dados com FILESTREAM e FileTable
Cria-se uma base de dados com um filegroup FILESTREAM apontando para uma pasta. Isto define onde os ficheiros serão armazenados no servidor de ficheiros.
CREATE DATABASE DemoFileTable
ON PRIMARY (NAME = DemoFileTable_data, FILENAME = 'C:\SQLData\DemoFileTable.mdf'),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM (NAME = DemoFileTable_filestream, FILENAME = 'C:\SQLData\FileStream')
LOG ON (NAME = DemoFileTable_log, FILENAME = 'C:\SQLData\DemoFileTable_log.ldf');
GO
Passo 4: Criar uma tabela FileTable
Uma FileTable funciona como uma tabela normal, com colunas fixas e uma ligação ao sistema de ficheiros. É necessário activar algumas opções e criar a tabela com a opção AS FileTable.
USE DemoFileTable;
GO
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
-- Certificar que FILESTREAM está disponível na base de dados
ALTER DATABASE CURRENT SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL);
GO
CREATE TABLE Docs AS FileTable
WITH (FileTable_Directory = 'DocsDirectory', FileTable_Collate_Filename = DATABASE_DEFAULT);
GO
Passo 5: Inserir e aceder a ficheiros (exemplo)
Pode inserir ficheiros via T-SQL (usando Openrowset BULK para carregar) ou copiar directamente para a pasta da FileTable no servidor. Exemplo T-SQL para inserir metadados e um ficheiro:
-- Inserir um ficheiro binário como varbinary e depois actualizar para a FileTable
-- Método mais simples: copiar o ficheiro para a pasta da FileTable no servidor
-- Exemplo de leitura de metadados da FileTable
SELECT file_stream, name, file_type, creation_time
FROM Docs
WHERE name = 'exemplo.txt';
Passo 6: Aceder aos ficheiros via sistema de ficheiros
Cada FileTable expõe uma pasta no servidor. No servidor SQL, navegue até à pasta configurada (ex.: C:\SQLData\FileStream\DocsDirectory). Copie ficheiros para a pasta e eles aparecem como registos na tabela; apagar um registo apaga o ficheiro.
Verificar o resultado
Confirme que a tabela contém registos e que os ficheiros aparecem na pasta do sistema de ficheiros. Execute:
SELECT TOP 10 stream_id, name, file_type, file_stream.PathName() AS FilePath
FROM Docs;
Verifique na pasta física que os ficheiros listados existem. Se não aparecerem, verifique erros comuns: FILESTREAM não activo, permissões da pasta, ou filegroup mal definido.
Conclusão
As FileTables tornam simples gerir ficheiros e metadados no SQL Server, facilitando backups e permissões centralizadas. Próximos passos: implementar controlo de permissões NTFS para a pasta da FileTable, testar performance e integrar com aplicações que leem ficheiros directamente da pasta. Dica: experimente copiar um ficheiro grande e observar como o SQL Server gera um registo na tabela — isto ajuda a compreender a sincronização FileTable/FS.