Este artigo foi traduzido por máquina.

Sob a tabela

Programação com FileStreams no SQL Server 2008

Bob Beauchemin

Download do código disponível na Galeria de código do MSDN
Procure o código on-line

Conteúdo

Filestreams de programação com o Transact SQL
Programação filestreams com E/s de arquivos.
O tipo de dados .NET SqlFileStream
FileStreams e transações
Recurso sinergia com filestreams

Sempre houve muita discussão sobre se grande blobs (grandes objetos binários), como documentos e itens de multimídia, devem ser armazenados no banco de dados ou no sistema de arquivos. Por um lado, o banco de dados é um repositório de dados especializado que fornece internas integradas backup e restauração, recuperação de ponto no tempo, transações, indexação, e muito mais. Por outro lado, ter dados grandes em um banco de dados pode causar fragmentação do banco de dados, e os recursos de recuperação BOM também significam que os dados de objeto grande é sempre gravados duas vezes, uma vez para o próprio banco de dados e uma vez para o log de transações. Mesmo ler dados grandes com o SQL significa usar buffers de banco de dados preciosa e liberar os dados em seriam caso contrário, ser cache na memória check-out no disco como um efeito colateral.

Para liquidar esse controversy uma vez por todas, Centro de Pesquisa da Microsoft foi um estudo sobre o assunto e publicados suas conclusões em um white paper " BLOB ou não BLOB: armazenamento de objeto grande em um banco de dados ou um sistema de arquivos? " (Consulte research.microsoft.com/apps/pubs/default.aspx?id=64525). Suas conclusões foram um obstáculo de opinião "Vamos armazenar tudo em um banco de dados", como testada um banco de dados do SQL Server 2005 contra o sistema de arquivo NTFS e recomendado "BLOBs menor que 256KB com mais eficiência são manipuladas pelo SQL Server, enquanto NTFS é mais eficiente para BLOBS maiores que 1 MB. Esse ponto break-even variam entre sistemas de bancos de dados diferentes, sistemas de arquivos e cargas de trabalho." Alguns programadores tentar têm o melhor dos dois mundos, armazenar o local de um arquivo NTFS em uma linha de banco de dados, mas isso sacrificará consistência transacional, a consulta integrada e outros recursos de banco de dados. No SQL Server 2008, você não precisará escolher; um novo recurso conhecido como o atributo de armazenamento fluxo permite que você definir colunas em tabelas do SQL Server com uma especificação de que os dados, na verdade, são armazenados no sistema de arquivos. Você pode consultar os dados com Transact SQL ou o fluxo APIs usando linguagens C++ e compatível com. NET e manter todos os outros recursos de gerenciamento de banco de dados. Nesta coluna, descreverei como você pode programar esse modelo de armazenamento híbrido usando os dois tipos de APIs.

Primeiro, você deve ter percebido que que mencionado o recurso como o atributo de armazenamento de fluxo. O fluxo não é um novo tipo de dados; é um novo mecanismo de armazenamento. Ele estará disponível apenas com tipo de dados varbinary (max) introduzido no SQL Server 2005. Para usar o fluxo armazenamento requer que o administrador de sistema permiti-lo em um nível de sistema operacional usando SQL Server Configuration Manager e o administrador do banco de dados ativá-lo em um nível de instância do SQL Server usando sp_configure. FileStream pode ser desativado, ativado para acesso local ou habilitado para acesso local e remoto. Além disso, o banco de dados deve definir um grupo de arquivos banco de dados que vincula um local de sistema de arquivo NTFS a um banco de dados do SQL Server. Observe que o grupo de arquivos precisa apontar para um local de sistema de arquivos local; filestreams não é possível ao vivo em um servidor remoto ou um dispositivos de armazenamento endereçável (NAS) de rede, a menos que o dispositivo NAS é apresentado como um volume NFS local por meio do iSCSI. Acessando os usos de fluxo o (SMB) bloco de mensagens de servidor de protocolo, portanto, se você pretende permitir o arquivo E/S estilo acesso de fora da máquina em que o SQL Server está instalado, você deve permitir o acesso à porta SMB (geralmente porta 445, com a porta 139 como fallback) através do firewall. Depois que a pré-requisitos administrativos estiverem no local, você simplesmente definir uma coluna de varbinary (max) como parte de uma definição de tabela com a propriedade FILESTREAM e seus dados para esta coluna é automaticamente armazenados em arquivos. Além disso, cada tabela que usa uma coluna FILESTREAM requer uma coluna definida usando o tipo de dados UNIQUEIDENTIFIER que tenha a propriedade ROWGUIDCOL. Uma versão da tabela de funcionários do banco de dados o Northwind que usa filestreams aparência Figura 1 .

A Figura 1 funcionários tabela usando filestreams

CREATE TABLE [dbo].[Employees2](
  [EmployeeID] [int] IDENTITY NOT NULL PRIMARY KEY,
  [LastName] [nvarchar](20) NOT NULL,
  [FirstName] [nvarchar](10) NOT NULL,
  [Title] [nvarchar](30) NULL,
  -- filestream storage for photo column
  [Photo] [varbinary](max) FILESTREAM NULL,
  [ReportsTo] [int] NULL,
  -- identifier column
  [RowGuid] [UNIQUEIDENTIFIER]  NOT NULL  
        ROWGUIDCOL UNIQUE DEFAULT NEWID()
);

FileStream usa o log de banco de dados tradicional e um mecanismo de log específico como uma extensão de log de transação tradicional que registra alterações de arquivo. A extensão é separada do SQL Server normal transação de banco de dados faça mas integrado com o backup e restaurar utilitários. Para obter mais informações sobre fluxo de um administrativo e banco de dados internos do ponto de vista, consulte white paper de excelente do Paul Randal "armazenamento de FileStream no SQL Server 2008" em msdn.microsoft.com/library/cc949109.

De um ponto do programador de modo de exibição, o objeto de fluxo pode comportar-se quase exatamente como os dados varbinary (max) do SQL Server tipo faria com algumas advertências. Você pode usar Transacta SQL para consultar os dados sem alterar os programas de aplicativo em todos os. O aplicativo de Windows Forms simples incluído no código deste artigo não precisa de nenhuma alteração para exibir a tabela Employees2 que defini acima em um controle DataGrid. Entretanto, o valor agregado do ponto de vista do desempenho vem ao usar os aprimoramentos de API específicas do fluxo para ler e gravar os dados por meio de APIs baseada em fluxo. Uma vitória adicional é que o tamanho máximo dos dados em uma determinada coluna não é limitado a 2 GB para a coluna com base em fluxo varbinary (max). O tamanho máximo dessas colunas específico é ilimitado. Que significa que você pode armazenar, por exemplo, imagens médicas 7GB, como imagens de X-Ray, em uma coluna em uma tabela do SQL Server comum. Dados de FILESTREAM não conta para o limite de tamanho máximo de 4 GB em um banco de dados do SQL Server Express Edition, para que ele ainda possa ser usado com blobs no SQL Server 2008 Express Edition.

Antes de eu for para as APIs, gostaria de destacar que, depois que você armazenou o arquivo de dados usando o armazenamento de fluxo do SQL Server, você não deve acessar ou alterar os dados fora do controle do SQL Server. Os diretórios em que os arquivos do fluxo residem são protegidos por uma lista de controle de acesso discricional (DACL) que permite o acesso somente pelo grupo do Windows que contém a conta de serviço do SQL Server e a conta do administrador do sistema. E o administrador do sistema poderá remover o acesso ao alterar a DACL. Quando um usuário tenta abrir um arquivo usando as APIs do fluxo, uma verificação de acesso é executada em relação às permissões de SQL tradicionais no banco de dados, esquema, tabela, e níveis de coluna e as permissões de NTFS são ignoradas. Editar os dados de fluxo diretamente usando o notepad.exe (ou mais provavelmente, um programa de editor especializados de fotos) geralmente irá resultar em um banco de dados danificado. No entanto, usando as APIs de fluxo transacionais que o SQL Server fornece, você poderia escrever seu próprio programa baseadas no SQL Server "bloco de transacional notas".

Filestreams de programação com o Transact SQL

Embora a programação filestreams com T-SQL é como programação de T-SQL comum, há algumas advertências. Em primeiro lugar, parciais atualizações para a coluna de fluxo usando o varbinary (max) gravação método não são permitidas. Além disso, porque as APIs do fluxo requer um nome de caminho de arquivo fornecido pelo SQL Server (isto é, as APIs de fluxo pode apenas ser usadas quando o valor de coluna de fluxo é não-NULL), T-SQL é a única maneira para obter o nome do arquivo. Embora inserindo um valor NULL em uma coluna de fluxo não criará um arquivo, inserir qualquer valor diferente de NULL irá fazer com que um arquivo de ser criado. Um UPDATE a uma coluna de fluxo causará o arquivo antigo a ser excluído e um novo arquivo seja criado em seu lugar. Uma operação DELETE em uma linha irá fazer com que o arquivo correspondente ser excluído. Observe que o arquivo excluído com uma operação UPDATE ou DELETE não desaparecerá do sistema de arquivos imediatamente; um segmento de coletor de lixo será ser usado para excluir o arquivo e recuperar o espaço fisicamente.

Todo o interno de T-SQL funciona que funcionam com o trabalho varbinary (max) com uma coluna de fluxo, inclusive mudar, NÚM.CARACT, SUBSTRING e CHARINDEX. Armazenamento de FILESTREAM é permitido apenas para colunas em tabelas de banco de dados; variáveis, parâmetros (incluindo parâmetros com valor de tabela), colunas na tabela temporária estruturas e valores de retorno de função com valor de tabela não pode usar o atributo FILESTREAM. Também observe que o atributo FILESTREAM está disponível somente em colunas varbinary (max); outros tipos de dados grandes como varchar (max) e XML não pode especificar o atributo de fluxo. Se você deseja armazenar caracteres ou dados XML no armazenamento de fluxo, você deve especificar a coluna como varbinary (max) e usar CAST ou CONVERT para processar os dados como caracteres ou XML.

Para acessar os dados de fluxo usando as APIs do fluxo, primeiro você deve usar T-SQL para obter um nome de caminho; isso é obtido com o método PathName() (diferencia maiúsculas de minúsculas) na coluna de fluxo. Caminhos lógicos do FileStream são versão, e no formato de versão 1 é usado pelo SQL Server 2008, o nome do caminho é associado à (mas não iguais a) o valor da coluna ROWGUIDCOL na mesma linha. Embora você possa usar colunas de fluxo em modos de exibição e tabelas derivadas, ser mantenha o ROWGUIDCOL ao redor caso você precise usar o método PathName(). Por exemplo, para tabela T que contém um fluxo e uma coluna rowguid, escreva o código na Figura 2 .

A Figura 2 criar um modo de exibição

CREATE VIEW View1 
AS
SELECT RowGuidColumn , FileStreamColumn
FROM T;

SELECT FileStreamColumn.PathName() FROM View1;  -- works
GO

CREATE VIEW View2 
AS
SELECT FileStreamColumn FROM T;
GO

-- Fails because it is missing the RowGuidColumn
SELECT FileStreamColumn.PathName() FROM View2;
GO

Finalmente, a criptografia de dados não oferece suporte em colunas de fluxo. Isso não ocorre apenas para a criptografia de dados APIs como EncryptByKey, mas também para o recurso de criptografia do SQL Server 2008 transparente dados. Embora bancos de dados com o armazenamento de fluxo podem especificar criptografia de dados transparente, os arquivos de fluxo não sejam criptografados.

Programação filestreams com E/s de arquivos.

Antes de usar E/s fluxo contínuo com a coluna de armazenamento de fluxo, há alguns requisitos no lado do cliente. Você deve usar uma conta de segurança integrada quando usar fluxo contínuo de E/s que não haja nenhuma maneira de passar credenciais SQL ao abrir o armazenamento de fluxo handle.Because foi implementado usando um driver de filtro de sistema de arquivos especiais, programação com uma coluna que usa o armazenamento de fluxo envolve trabalhar com um identificador de arquivo que não oferece suporte a todas as operações de Win32. A função nativeWin32 que recupera o identificador de arquivo é OpenSqlFilestream. Esta função é parte do SQL Native Client 10 DLL que também contém o driver ODBC do SQL Server, provedor de banco de dados OLE e bibliotecas de rede. A função retorna um identificador Win32 que ofereça suporte a maioria das funcionalidades fluxo contínuo de um identificador de arquivo do Win32. Embora obter um identificador de arquivo Win32 requer um nome de caminho e algumas opções adicionais, a função OpenSqlFilestream requer duas partes de informações que podem ser fornecidos apenas pelo SQL Server. Essas são o nome para o arquivo retornado pelo chamando o método PathName() na coluna que usa o armazenamento de fluxo e um token de transação. Isso significa que, quando você está programando com OpenSqlFilestream, estiver dividindo o INSERT, UPDATE ou a instrução SELECT para o equivalente de duas instruções "SQL", a instrução T-SQL e a instrução de fluxo. Essas declarações devem ser vinculadas junto com uma transação. Embora será menciono mais sobre a transação e os níveis de isolamento com suporte posteriormente, por enquanto, é suficiente para saber o que você deve chamar uma função T-SQL, GET_FILESTREAM_TRANSACTION_CONTEXT() para obter o token de transação. Esse token deverão ser obtida no contexto do mesmo usuário do windows que abrir o arquivo. Observe que a instrução de SQL original para obter o token de transação deve ser parte de uma transação, caso contrário, o token de transação será NULL e OpenSqlFilestream falhará. Você não pode confirmar a transação até que o HANDLE seja fechado. O identificador de arquivo APIs que são suportados usando a alça de arquivo especial são ReadFile, WriteFile, TransmitFile, SetFilePointer, SetEndOfFile ou FlushFileBuffers. Tentativa de chamar qualquer outro arquivo API retorna ERROR_ACCESS_DENIED. Especificamente não há suporte para arquivos de memória mapeada com o HANDLE especial.

Um exemplo completo de usando o ODBC e C++ para inserir um novo linha e fluxo dados usando OpenSqlFilestream é fornecido no SQL Server 2008 Books Online.

Com uma instrução SELECT, você será fazer somente uma viagem de ida e única volta para o banco de dados para o caminhos e a transação token; com uma instrução INSERT ou UPDATE, você será deseja fazer viagem de ida e apenas um banco de dados de volta bem. Com essas instruções, a cláusula OUTPUT de T-SQL, introduzida no SQL Server 2005, vem a sua ajuda. Eis uma instrução UPDATE que processa uma única linha e obtém todas as informações que você precisa em uma viagem de ida e volta:

UPDATE dbo.Employees2 
SET name = 'NewName' WHERE id = 8
OUTPUT inserted.photo.PathName(),
       GET_FILESTREAM_TRANSACTION_CONTEXT()

Ainda não mencionei usando a instrução de DELETE como excluir uma linha também excluirá o arquivo; você não pode usar o fluxo contínuo de E/s para executar um DELETE. No entanto, existem algumas coisas que você precisa saber ao usar INSERT ou UPDATE para ler e gravar o blob. Além disso, irá dividir a atualização de blob em dois casos de uso: concluir substituição (Reconfiguração) e atualização parcial.

Inserindo uma linha que contém um blob usando INSERT é um dos motivos melhores para usando fluxo contínuo de E/s. SQL Server APIs não suportam entrada de fluxo usando uma coluna varbinary (max), embora você pode escrever os dados em blocos usando a função de STUFF T-SQL ou o método de gravação. (Lembre-se de que o método de gravação é proibido ao usar o armazenamento de fluxo.) O componente interessante com INSERT é que inserir um valor NULL não cria nenhum arquivo. O método de PathName() também deve retornar NULL e não seria necessário nenhum arquivo para os dados do fluxo contínuo. A maneira de abordar um INSERT é inserir uma seqüência de caracteres vazia em vez de um valor NULL, recuperar o nome do caminho e o conteúdo de fluxo para o arquivo vazio. A instrução T-SQL poderia ter esta aparência:

INSERT dbo.Employees2 (id, ... photo)
VALUES(1, ... CAST('' as VARBINARY(MAX))
OUTPUT inserted.photo.PathName(),GET_FILESTREAM_TRANSACTION_CONTEXT()

Você pode, em seguida, abra o arquivo para gravação e fluxo nos dados. Uma substituição completa UPDATE funcionaria como um INSERT. Você pode atualizar as colunas não-fluxo, retornar o nome do caminho e o token de transação e a dados de fluxo em através o identificador de arquivo. A menos que você saiba que a coluna de armazenamento de fluxo já contém dados, é uma boa idéia para definir os dados para a seqüência vazia no T-SQL atualizados instrução.

Uma atualização parcial de uma coluna de fluxo é um pouco mais complicada porque você deseja leia as informações no arquivo antes de fazer uma atualização. Para fazer isso, você pode usar a função DeviceIoControl com a alça e o parâmetro FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT. Isso faz com que uma cópia do lado do servidor do conteúdo do arquivo. Depois de executar essa chamada, ReadFile retornará os dados apropriados antes da chamada que ReadFile irá retornar a fim de arquivo. Se você estiver lendo e atualização dessa forma, é uma boa idéia usar E/s sobreposta para aplicativos de alto desempenho e especialmente aqueles que podem acessar fluxo no mesmo computador SQL Server. Tenha em mente que se você precisar fazer muita atualizações parciais, usando o armazenamento de fluxo é muito mais lento do que o uso varbinary (max) do SQL Server sem armazenamento de fluxo.

O tipo de dados .NET SqlFileStream

Os programadores de .NET geralmente não deseja lidar com identificadores de arquivo do Win32. Embora seja possível usar OpenSqlFilestream em programas de .NET usando uma técnica chamada PInvoke (código da plataforma chamar), seria mais conveniente para ter a função OpenSqlFilestream e arquivo manipular acesso encapsulado na classe do .NET. No .NET Framework 3.5 SP1, a classe System.Data.Types.SqlFileStream preenche a lista perfeitamente. O uso é principalmente o mesmo; construtor a SqlFileStream requer um nome de caminho e um token de transação, bem como algumas opções. Usando SqlFileStream para INSERT uma linha é ilustrado no download de código que acompanha esta coluna.

O objeto SqlFileStream deriva System.IO.Stream, e você usá-lo como você poderia usar um fluxo de .NET "normal". Algumas diferenças importantes entre usar a API de SqlFileStream e a função do Win32 OpenSqlFilestream é que SqlFileStream usa um tamanho de buffer padrão de 4 k; alça do OpenSqlFilestream não. Além disso, usando SqlFileStream para modo ReadWrite executará automaticamente as chamadas DeviceIoControl como uma conveniência; a API nativa não suporta isso e padrões de atualização parcial serão envolvidas chamadas DeviceIoCtrl explícitas. Para usar o tipo de dados SqlFileStream, é necessário ter o .NET 3.5 SP1 deve ser instalado no servidor cliente ou da web.

FileStreams e transações

Como mencionado anteriormente, uma dos Atracões de usar armazenamento de fluxo em vez de simplesmente armazenar nomes de arquivo no SQL Server e arquivos no sistema de arquivo é que os dados são consistentes transacional. Se você inserir uma linha no Transact SQL e inserir um arquivo usando as APIs do fluxo, a toda a operação for bem-sucedida ou falha. Não há nenhuma possibilidade de ter nomes de arquivos dos arquivos que não existem ou itens de sistema de arquivos órfãos que não possuem uma entrada correspondente no SQL Server. A API OpenSqlFilestream assegura isso ao exigir que você tenha uma transação válida, aberta em todas as vezes ao usar as APIs do fluxo. Mas o SQL Server oferece suporte a uma variedade de níveis de isolamento de transação e dois semântica de transação diferente: proteção e controle de versão. Como as APIs do fluxo funciona com todos os níveis de isolamento, dado que o Gerenciador de bloqueio do SQL Server não gerencia bloqueios do sistema de arquivos?

Ao usar o fluxo contínuo, é útil pensar em sua operação atômica como composta de dois diferentes instruções SQL--um para a parte de T-SQL e uma segunda instrução para a parte fluxo. Para obter o token de transação, você precisará executar a parte de T-SQL primeiro. Antes de executar o comando T-SQL você deve começar uma transação explícita usando o método ADO.NET SqlConnection.BeginTransaction ou dos System.Transactions TransactionScope; métodos análogos para gerenciamento de transações manuais e automáticas são aparece nas outros APIs como ODBC. A transação deve ser mantida aberta até que o identificador de arquivo é fechado. Não emitir uma chamada SqlTransaction.Save é permitida enquanto o identificador de arquivo é aberto e fará com que a transação uncommittable. Uma chamada de SqlTransaction.Rollback emitida reverterá a transação, mesmo se o arquivo é aberto. Disparadores acionados quando o identificador de arquivo é fechado.

Usando as APIs de fluxo e armazenamento de fluxo é permitida em todos os níveis de isolamento de transação bloqueio quatro, embora a semântica do fluxo de acesso sempre seja semelhante à leitura confirmada. Usando o nível de isolamento de leitura confirmada (o padrão), se o arquivo é aberto para leitura, outros leitores serão ser capaz de ler o arquivo — gravadores serão bloqueados. Se o arquivo é aberto para leitura, ele permanecerá bloqueado até o final da transação. Nível de isolamento Read-é permitido com a limitação que se uma atualização do arquivo está em andamento, a transação leitura não confirmados será ler a versão antiga do arquivo, em vez a nova versão proposta como é o comportamento não confirmados leitura normal. Leitura repetida e o comportamento pode ser serializado é o mesmo ao usar o arquivo de fluxo contínuo como quando linhas são bloqueadas no banco de dados.

Níveis de isolamento de versão — ou seja, isolamento de instantâneo de leitura confirmada e transações de instantâneo — não são permitidos em um banco de dados que usa filestreams. Isso é verdadeiro para o banco de dados inteiro, não apenas a tabela que contém uma coluna de fluxo. A instrução ALTER DATABASE que permite leitura confirmada instantâneo isolamento e o que permite transações de instantâneo falhará na presença de armazenamento de fluxo.

Recurso sinergia com filestreams

FileStream é útil para armazenar dados grandes em um banco de dados sem incorrer em sobrecarga o log de transações e o comportamento de fragmentação do banco de dados, mas ocasionalmente será útil para elevar uma parte dos dados a uma coluna computada persistente. Isso permite que você fazer consultas sobre Propriedades do blob sem ler o arquivo em todos os. Por exemplo, diga que você foram armazenando fotos no formato JPEG e deseja armazenar partes da tabela de cores, como cor do plano de fundo ou foto altura e largura, separadamente. Você pode simplesmente definir uma coluna computada persistente para essa parte da coluna varbinary (max); os dados é armazenada na linha. Um exemplo, usando a tabela Employees2 definida acima, ficaria assim:

ALTER TABLE dbo.Employees2
  ADD PhotoWidth AS dbo.ExtractWidth(Photo) PERSISTED;
A SQL query to obtain the photo width does not need to access the file at all:
SELECT Id, Photo 
FROM dbo.Employees2
WHERE PhotoWidth > 1200;

Esteja ciente, entretanto, que índices em colunas calculadas persistentes de tipo varbinary não são permitidos.

Um ótimo exemplo de Sinergia de recurso é a combinação de índices de texto completo do SQL Server e texto completo que pesquisa com o armazenamento de fluxo. Componentes de filtro de pesquisa de texto completo existem para tipos de documento, como documentos do Microsoft Office, arquivos PDF e arquivos de texto, e armazenamento de fluxo permite que esses arquivos para ser armazenadas no sistema de arquivos em vez de no banco de dados. Como um exemplo concreto, você pode armazenar cópias dos logs de erros ou arquivos de log da Web em uma coluna de armazenamento de fluxo e a coluna de índice de texto completo. É SQL Server 2008, pesquisa de texto completo executado em processo, para que ele não é necessário fazer chamadas de fora de processo para o serviço de pesquisa. Uma consulta como a seguir funciona em processo e pode ser bastante rápida:

SELECT id, Abstract 
FROM error_logs 
WHERE CONTAINS(ErrorText, 'unhandled');

Comecei a este artigo por sugestão de fluxo armazenamento fornecido não apenas integrado backup e restauração, mas consistência transacional entre dados de SQL e dados de arquivos, embora fluxo armazenamento possa usar somente armazenamento de disco local. Se estiver preocupado apenas com consistência transacional e desejar os arquivos residam em um servidor remoto ou armazenamento endereçável de conteúdo, o SQL Server 2008 inclui um recurso complementar, armazenamento remoto de blob (EDR). Este recurso está disponível como um download gratuito como parte do SQL Server 2008 Feature Pack. EDR consiste em uma API que permite a manipulação de transação e uma série de procedimentos armazenados para lidar com ponteiros de blob em tabelas do banco de dados, coleta de lixo do blob e participação de transação. Fornecedores de armazenamento endereçável de conteúdo fornecer drivers para seu hardware específico. Um driver de EDR de exemplo para o sistema de arquivos NTFS está disponível como um download em CodePlex e EMC tem liberar um beta provedor de EDR para seu sistema de armazenamento Centera endereçadas de conteúdo. A API de EDR não é semelhante para o API de fluxo, mas essas APIs pode ser alinhadas no futuro.

Finalmente, o armazenamento de fluxo permite para armazenar blobs grandes como arquivos no sistema de arquivos e acessá-los com instruções T-SQL ou APIs de fluxo transacional. Com esse recurso, você pode obter o desempenho do fluxo contínuo, bem como integração de total do banco de dados para blobs grandes.

Envie suas dúvidas e comentários para Bob para mmdbdev@Microsoft.com

Bob Beauchemin é um profissional de aplicativo de banco de dados centralizada e arquiteto, autor do curso e instrutor, gravador e Developer a capacidade de parceiro em SQLskills. Ele é gravado livros e artigos no SQL Server, acesso a dados e tecnologias de integração e segurança do banco de dados. Você pode contatá-lo em bobb@sqlskills.com.