Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O FILESTREAM permite que aplicativos baseados no SQL Server armazenem dados não estruturados, como documentos e imagens, no sistema de arquivos. Os aplicativos podem aproveitar as APIs de streaming avançadas e o desempenho do sistema de arquivos e, ao mesmo tempo, manter a consistência transacional entre os dados não estruturados e os dados estruturados correspondentes.
FILESTREAM integra o Mecanismo de Banco de Dados do SQL Server a um sistema de arquivos NTFS ao armazenar dados de BLOB (objeto binário grande) como arquivos no sistema de arquivos. As instruções do Transact-SQL podem inserir, atualizar, consultar, pesquisar e fazer backup dos dados do FILESTREAM. As interfaces do sistema de arquivos Win32 fornecem acesso de streaming aos dados.
FILESTREAM usa o cache do sistema NT para armazenar dados de arquivo. Isso ajuda a reduzir qualquer efeito que os dados FILESTREAM possam ter no desempenho do Mecanismo de Banco de Dados. O pool de buffers do SQL Server não é usado; portanto, essa memória está disponível para processamento de consulta.
FILESTREAM não é habilitado automaticamente quando você instala ou atualiza o SQL Server. Você deve habilitar FILESTREAM usando o SQL Server Configuration Manager e o SQL Server Management Studio. Para usar FILESTREAM, você deve criar ou modificar um banco de dados para conter um tipo especial de grupo de arquivos. Em seguida, crie ou modifique uma tabela para que ela contenha uma varbinary(max) coluna com o atributo FILESTREAM. Depois de concluir essas tarefas, você pode usar Transact-SQL e Win32 para gerenciar os dados FILESTREAM.
Para obter mais informações sobre como instalar e usar FILESTREAM, consulte a lista de Tarefas Relacionadas.
Quando usar FILESTREAM
No SQL Server, os BLOBs podem ser dados padrão varbinary(max) que armazenam os dados em tabelas ou objetos FILESTREAM varbinary(max) que armazenam os dados no sistema de arquivos. O tamanho e o uso dos dados determinam se você deve usar o armazenamento de banco de dados ou o armazenamento do sistema de arquivos. Se as seguintes condições forem verdadeiras, você deverá considerar o uso de FILESTREAM:
Os objetos que estão sendo armazenados são, em média, maiores que 1 MB.
A rapidez no acesso à leitura é importante.
Você está desenvolvendo aplicativos que usam uma camada intermediária para a lógica do aplicativo.
Para objetos menores, armazenar varbinary(max) BLOBs no banco de dados geralmente fornece melhor desempenho de streaming.
Armazenamento FILESTREAM
O armazenamento FILESTREAM é implementado como coluna varbinary(max) onde os dados são armazenados como BLOBs no sistema de arquivos. Os tamanhos dos BLOBs são limitados apenas pelo tamanho do volume do sistema de arquivos. A limitação padrão varbinary(max) de tamanhos de arquivo de 2 GB não se aplica aos BLOBs armazenados no sistema de arquivos.
Para especificar que uma coluna deve armazenar dados no sistema de arquivos, especifique o atributo FILESTREAM em uma varbinary(max) coluna. Isso faz com que o Mecanismo de Banco de Dados armazene todos os dados para essa coluna no sistema de arquivos, mas não no arquivo de banco de dados.
Os dados FILESTREAM devem ser armazenados em grupos de arquivos FILESTREAM. Um grupo de arquivos FILESTREAM é um grupo de arquivos especial que contém diretórios do sistema de arquivos em vez dos próprios arquivos. Esses diretórios do sistema de arquivos são chamados de contêineres de dados. Os contêineres de dados são a interface entre o armazenamento do Mecanismo de Banco de Dados e o armazenamento do sistema de arquivos.
Ao usar o armazenamento FILESTREAM, considere o seguinte:
Quando uma tabela contém uma coluna FILESTREAM, cada linha deve ter uma ID de linha exclusiva não nula.
Vários contêineres de dados podem ser adicionados a um grupo de arquivos FILESTREAM.
Os contêineres de dados FILESTREAM não podem ser aninhados.
Quando você estiver usando o cluster de failover, os grupos de arquivos FILESTREAM devem estar em recursos de disco compartilhados.
Os grupos de arquivos FILESTREAM podem estar em volumes compactados.
Gerenciamento Integrado
Como FILESTREAM é implementado como uma varbinary(max) coluna e integrado diretamente ao Mecanismo de Banco de Dados, a maioria das ferramentas e funções de gerenciamento do SQL Server funcionam sem modificação para dados FILESTREAM. Por exemplo, você pode usar todos os modelos de backup e recuperação com dados FILESTREAM, e os dados FILESTREAM são incluídos no backup junto com os dados estruturados no banco de dados. Se você não quiser fazer backup de dados FILESTREAM com dados relacionais, poderá usar um backup parcial para excluir grupos de arquivos FILESTREAM.
Segurança Integrada
No SQL Server, os dados FILESTREAM são protegidos da mesma forma que outros dados são protegidos: concedendo permissões nos níveis de tabela ou coluna. Se um usuário tiver permissão para a coluna FILESTREAM em uma tabela, o usuário poderá abrir os arquivos associados.
Observação
Não há suporte para criptografia em dados FILESTREAM.
Somente a conta na qual a conta de serviço do SQL Server é executada recebe permissões NTFS para o contêiner FILESTREAM. Recomendamos que o contêiner de dados não receba permissões de nenhuma outra conta.
Observação
Os logons do SQL não funcionarão com contêineres FILESTREAM. Somente a autenticação NTFS funcionará com contêineres FILESTREAM.
Acessando dados BLOB com Transact-SQL e acesso ao sistema de arquivos por streaming.
Depois de armazenar dados em uma coluna FILESTREAM, você pode acessar os arquivos usando transações Transact-SQL ou usando APIs Win32.
Acesso Transact-SQL
Usando o Transact-SQL, você pode inserir, atualizar e excluir dados FILESTREAM:
Você pode usar uma operação de inserção para pré-preencher um campo FILESTREAM com um valor nulo, um valor vazio ou dados embutidos relativamente curtos. No entanto, uma grande quantidade de dados é transmitida com mais eficiência para um arquivo que usa interfaces Win32.
Ao atualizar um campo FILESTREAM, você modifica os dados BLOB subjacentes no sistema de arquivos. Quando um campo FILESTREAM é definido como NULL, os dados BLOB associados ao campo são excluídos. Não é possível usar uma atualização em partes Transact-SQL, implementada como UPDATE**.**Write() para executar atualizações parciais nos dados.
Ao excluir uma linha ou excluir ou truncar uma tabela que contém dados FILESTREAM, você exclui os dados de BLOB subjacentes no sistema de arquivos.
Acesso ao streaming do sistema de arquivos
O suporte de streaming do Win32 funciona no contexto de uma transação do SQL Server. Em uma transação, você pode usar funções FILESTREAM para obter um caminho lógico do sistema de arquivos UNC de um arquivo. Em seguida, use a API OpenSqlFilestream para obter um identificador de arquivo. Esse identificador pode ser usado por interfaces de streaming de arquivo Win32, como ReadFile() e WriteFile(), para acessar e atualizar o arquivo por meio do sistema de arquivos.
Como as operações de arquivo são transacionais, você não pode excluir ou renomear arquivos FILESTREAM por meio do sistema de arquivos.
Modelo de demonstração
O sistema de arquivos FILESTREAM modela uma instrução Transact-SQL ao usar a abertura e fechamento de arquivos. A instrução começa quando um manipulador de arquivo é aberto e termina quando o manipulador é fechado. Por exemplo, quando um identificador de gravação é fechado, qualquer possível gatilho AFTER registrado na tabela é acionado como se uma instrução UPDATE fosse concluída.
Namespace de armazenamento
Em FILESTREAM, o Mecanismo de Banco de Dados controla o namespace do sistema de arquivos físico BLOB. Uma nova função intrínseca, PathName, fornece o caminho UNC lógico do BLOB que corresponde a cada célula FILESTREAM na tabela. O aplicativo usa esse caminho lógico para obter o identificador Win32 e operar nos dados BLOB usando interfaces regulares do sistema de arquivos Win32. A função retorna NULL se o valor da coluna FILESTREAM for NULL.
Acesso ao sistema de arquivos transacionado
Uma nova função intrínseca, GET_FILESTREAM_TRANSACTION_CONTEXT(), fornece o token que representa a transação atual à qual a sessão está associada. A transação deve ter sido iniciada e ainda não abortada ou efetivada. Ao obter um token, o aplicativo associa as operações de streaming do sistema de arquivos FILESTREAM a uma transação iniciada. A função retorna NULL no caso de nenhuma transação iniciada explicitamente.
Todos os identificadores de arquivo devem ser fechados antes que a transação seja confirmada ou abortada. Se um identificador for deixado aberto além do escopo da transação, leituras adicionais no identificador causarão uma falha; gravações adicionais no identificador serão bem-sucedidas, mas os dados reais não serão gravados em disco. Da mesma forma, se o banco de dados ou a instância do Mecanismo de Banco de Dados for desligada, todos os identificadores abertos são invalidados.
Durabilidade transacional
Usando FILESTREAM, após a confirmação da transação, o Motor de Banco de Dados garante a durabilidade da transação para dados FILESTREAM BLOB modificados por meio de acesso streaming ao sistema de arquivos.
Semântica de isolamento
A semântica de isolamento é governada pelos níveis de isolamento de transações do Mecanismo de Banco de Dados. Há suporte para o nível de isolamento com confirmação de leitura para Transact-SQL e acesso ao sistema de arquivos. Há suporte para operações de leitura repetível, bem como isolamentos serializáveis e de snapshot. Não há suporte para leitura suja.
As operações de abertura de acesso ao sistema de arquivos não aguardam nenhum bloqueio. Em vez disso, as operações abertas falharão imediatamente se não puderem acessar os dados devido ao isolamento da transação. As chamadas à API de streaming falharão com ERROR_SHARING_VIOLATION se a operação aberta não puder continuar devido à violação de isolamento.
Para permitir que atualizações parciais sejam feitas, o aplicativo pode emitir um controle FS do dispositivo (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) para buscar o conteúdo antigo no arquivo que o identificador aberto faz referência. Isso acionará uma cópia do conteúdo existente no servidor. Para melhorar o desempenho do aplicativo e evitar a execução de possíveis tempos limite quando você estiver trabalhando com arquivos muito grandes, recomendamos que você use E/S assíncrona.
Se o FSCTL for emitido após a gravação do identificador, a última operação de gravação persistirá e as gravações anteriores feitas no identificador serão perdidas.
APIs do sistema de arquivos e níveis de isolamento suportados
Quando uma API do sistema de arquivos não pode abrir um arquivo devido a uma violação de isolamento, uma exceção ERROR_SHARING_VIOLATION é retornada. Essa violação de isolamento ocorre quando duas transações tentam acessar o mesmo arquivo. O resultado da operação de acesso depende do modo em que o arquivo foi aberto e da versão do SQL Server na qual a transação está em execução. A tabela a seguir descreve os resultados possivelmente para duas transações que estão acessando o mesmo arquivo.
| Transação 1 | Transação 2 | Resultado no SQL Server 2008 | Resultado no SQL Server 2008 R2 e versões posteriores |
|---|---|---|---|
| Aberto para leitura. | Aberto para leitura. | Ambos têm êxito. | Ambos têm êxito. |
| Aberto para leitura. | Abra para gravação. | Ambos têm êxito. As operações de gravação na transação 2 não afetam as operações de leitura executadas na transação 1. | Ambos têm êxito. As operações de gravação na transação 2 não afetam as operações de leitura executadas na transação 1. |
| Abra para gravação. | Aberto para leitura. | A abertura para a transação número 2 falha com uma exceção ERROR_SHARING_VIOLATION. | Ambos têm êxito. |
| Abra para gravação. | Abra para gravação. | A abertura da transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. | A abertura da transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. |
| Aberto para leitura. | Abra para SELECT. | Ambos têm êxito. | Ambos têm êxito. |
| Aberto para leitura. | Abra para UPDATE ou DELETE. | Ambos têm êxito. As operações de gravação na transação 2 não afetam as operações de leitura executadas na transação 1. | Ambos têm êxito. As operações de gravação na transação 2 não afetam as operações de leitura executadas na transação 1. |
| Abra para gravação. | Aberto para SELECT. | A transação 2 fica bloqueada até que a transação 1 seja confirmada, encerrada ou até que o bloqueio da transação expire. | Ambos têm êxito. |
| Abra para gravação. | Abra para ATUALIZAR ou EXCLUIR. | A transação 2 bloqueia até que a transação 1 confirme ou termine, ou o bloqueio de transação expire. | A transação 2 fica bloqueada até que a transação 1 seja confirmada ou encerrada, ou o bloqueio da transação expire. |
| Abra para Selecionar. | Abra para ler. | Ambos têm êxito. | Ambos têm êxito. |
| Pronto para SELECT. | Abrir para escrever. | Ambos têm êxito. As operações de gravação na transação 2 não afetam a transação 1. | Ambos têm êxito. As operações de escrita na transação 2 não afetam a transação 1. |
| Abra para atualizar ou excluir. | Abrir para leitura. | A operação aberta na transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. | Ambos têm êxito. |
| Abrir para atualizar (UPDATE) ou excluir (DELETE). | Abra para gravação. | A operação aberta na transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. | A abertura da operação na transação 2 falha devido a uma exceção ERROR_SHARING_VIOLATION. |
| Abra para SELECT com leitura repetível. | Abra para leitura. | Ambos têm êxito. | Ambos têm êxito. |
| Abra para SELECT com leitura repetível. | Abra para gravação. | A operação aberta na transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. | A operação aberta na transação 2 falha com uma exceção ERROR_SHARING_VIOLATION. |
Write-Through de clientes remotos
O acesso remoto do sistema de arquivos aos dados FILESTREAM está habilitado no protocolo SMB (Server Message Block). Se o cliente for remoto, nenhuma operação de gravação será armazenada em cache pelo lado do cliente. As operações de gravação sempre serão enviadas para o servidor. Os dados podem ser armazenados em cache no lado do servidor. Recomendamos que os aplicativos em execução em clientes remotos consolidem pequenas operações de gravação para fazer menos operações de gravação usando um tamanho de dados maior.
Não há suporte para a criação de exibições mapeadas de memória (E/S mapeada por memória) usando um identificador FILESTREAM. Se o mapeamento de memória for usado para dados FILESTREAM, o Mecanismo de Banco de Dados não poderá garantir a consistência e a durabilidade dos dados ou a integridade do banco de dados.
Tarefas Relacionadas
Habilitar e configurar o FILESTREAM
Criar um banco de dados FILESTREAM-Enabled
Criar uma tabela para armazenar dados FILESTREAM
Acessar dados FILESTREAM com Transact-SQL
Criar aplicativos clientes para dados FILESTREAM
Acessar dados FILESTREAM com OpenSqlFilestream
Fazer atualizações parciais em dados FILESTREAM
Evitar conflitos com operações de banco de dados em aplicativos FILESTREAM
Mover um banco de dados FILESTREAM-Enabled
Configurar FILESTREAM em um cluster de failover
Configurar um firewall para acesso FILESTREAM
Conteúdo relacionado
Compatibilidade FILESTREAM com outros recursos do SQL Server