sql >> Databasteknik >  >> RDS >> Database

Lagra filer i SQL-databas med FILESTREAM – Del 1

FILESTREAM introducerades av Microsoft 2008. Syftet var att lagra och hantera ostrukturerade filer mer effektivt. Innan FILESTREAM introducerades användes följande metoder för att lagra data i SQL-servern:

  1. Ostrukturerade filer kan lagras i kolumnen VARBINARY eller IMAGE i en SQL Server-tabell. Detta tillvägagångssätt är effektivt för att upprätthålla transaktionskonsistens och minskar filhanteringens komplexitet, men när klientapplikationen läser data från SQL-tabellen använder den SQL-minne vilket leder till dålig prestanda.
  2. Istället för att lagra hela filen i SQL-tabellen, lagra den fysiska platsen för den ostrukturerade filen i SQL-tabellen. Detta tillvägagångssätt ger enorma prestandaförbättringar, men det säkerställer inte transaktionskonsistensen och filhanteringen var också svår.

FILESTREAM-funktionen är mycket effektiv eftersom den tillåter lagring av BLOB-filer i NT-filsystemet och bibehåller transaktionskonsistensen. När en klientapplikation läser data från FILESTREAM-behållaren, istället för att använda minnet i SQL Server-bufferten, använder den Nthe T-systemcachen vilket förbättrar prestandan.

FILESTREAM är inte en datatyp. Det är ett attribut som kan tilldelas kolumnen VARBINARY(MAX). När VARBINARY(MAX)-kolumnen är tilldelad till FILESTREAM-attributet kallas den för en FILESTREAM-kolumn. Data som lagras i FILESTREAM-kolumnen kommer att lagras i NT-systemet som en diskfil, och pekaren för filen lagras i tabellen. Kolumnen VARBINARY(max) med FILESTREAM-attributet tilldelat har ingen gräns för lagring av 2 GB i tabellen. Därför kan vi också lagra stora filer.

I den här artikeln kommer jag att demonstrera enligt följande:

  1. Hur man aktiverar FILESTREAM-funktionen.
  2. Hur man skapar och konfigurerar FILESTREAM-filgrupper och FILESTREAM-databehållare.
  3. Hur man lagrar och kommer åt data från de FILESTREAM-aktiverade tabellerna.

Demo:

I den här demon kommer jag att använda:

  1. Databasserver :SQL Server 2017
  2. Programvara :SQL Server Management Studio
  3. Databas :FileStream_Demo

Konfigurera FILESTREAM Access i SQL Server Database

För att konfigurera FileStream i SQL Server, gör följande ändringar i SQL Server.

  1. Aktivera FILESTREAM-funktionen från SQL Server Configuration Manager.
  2. Aktivera FILESTREAM-åtkomstnivån på SQL Server-instansen.
  3. Skapa en FILESTREAM-filgrupp och en FileStream-behållare för att lagra BLOB-data.

Aktivera FILESTREAM-funktionen

För att aktivera FileStream på vilken databas som helst, aktivera först FileStream-funktionen på SQL Server-instansen. För att göra det, öppna SQL Server Configuration Manager, högerklicka på SQL Instance, välj Egenskaper , som visas i följande bild:

En dialogruta för att konfigurera serveregenskaper öppnas. Växla till FILESTREAM flik. Välj Aktivera FILESTREAM för T-SQL-åtkomst . Välj Aktivera FILESTREAM för I/O-åtkomst och välj sedan Tillåt fjärrklientåtkomst till FILESTREAM-data . I Windows delningsnamn textrutan, ange ett namn på katalogen för att lagra filerna. Se följande bild:

Klicka på OK och starta om SQL-tjänsten.

Aktivera FILESTREAM-åtkomstnivå på SQL Server-instans

När FILESTREAM-funktionen är aktiverad ändrar du åtkomstnivån för FILESTREAM. För att ändra åtkomstnivån för FileStream, kör följande fråga:

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

I ovanstående fråga är parametrarna nedan giltiga värden:

0 betyder FILESTREAM-stödet för SQL-instans är inaktiverat.

1 betyder FILESTREAM-stödet för T-SQL är aktiverat.

2 betyder FILESTREAM-stödet för T-SQL och Win32 streaming-åtkomst är aktiverat.

Du kan ändra åtkomstnivån för FILESTREAM med SQL Server Management Studio. För att göra det, högerklicka på en SQL Server-anslutning>> välj Egenskaper>> I dialogrutan för serveregenskaper väljer du FileStream Access Level från rullgardinsmenyn och välj Full åtkomst aktiverad , som visas i följande bild:

När parametern har ändrats, starta om SQL Server-tjänster.

Lägg till FILESTREAM filgrupp och datafiler

När FILESTREAM är aktiverat lägger du till FILESTREAM-filgruppen och FILESTREAM-behållaren.

För att göra det högerklickar du på FileStream-Demo databas>> välj Egenskaper>> I den vänstra rutan i Databasegenskaper i dialogrutan väljer du Filgrupper>> Klicka på Lägg till filgrupp i FILESTREAM-rutnätet knapp> > Namnge filgruppen som Dummy-dokument . Se följande bild:

När filgruppen har skapats väljer du filer i dialogrutan Databasegenskaper. och klicka på knappen Lägg till. Databasfiler-rutnätet aktiverar. I kolumnen Logiskt namn anger du namnet – Dummy-Document . Välj FILESTREAM Data i Filtyp rullgardinsmenyn. Välj Dummy-Document i Filgruppen kolumn. I sökvägen kolumn, ange katalogplatsen där filerna kommer att lagras (E:\Dummy-Documents). Se följande bild:

Alternativt kan du lägga till FILESTREAM-filgruppen och behållare genom att köra följande T-SQL-fråga:

USE [master]
GO
ALTER DATABASE [FileStream_Demo] ADD FILEGROUP [Dummy-Documents] CONTAINS FILESTREAM
GO
ALTER DATABASE [FileStream_Demo] ADD FILE ( NAME = N'Dummy-Documents', FILENAME = N'E:\Dummy-Documents' ) TO FILEGROUP [Dummy-Documents]
GO

För att verifiera att FileStream-behållaren har skapats, öppna Utforskaren i Windows och navigera till katalogen "E:\Dummy-Document".

Som visas i bilden ovan, $FSLOG-katalogen och filestream.hdr filen har skapats. $FSLOG är som SQL server T-Log och filestream.hdr innehåller metadata för FILESTREAM. Se till att du inte ändrar eller redigerar dessa filer.

Lagra filer i SQL-tabell

I den här demon kommer vi att skapa en tabell för att lagra olika filer från datorn. Tabellen har följande kolumner:

  1. Rootkatalogen " kolumn för att lagra filplatsen.
  2. Filnamnet Filnamn ” för att lagra namnet på filen.
  3. FileAttribute ” kolumn för att lagra filattribut (Raw/Directory.
  4. FileCreateDate ” kolumn för att lagra tid för filskapande.
  5. Filstorlek ” för att lagra filens storlek.
  6. FileStreamCol ” kolumn för att lagra innehållet i filen i binärt format.

Skapa en SQL-tabell med en FILESTREAM-kolumn

När FILESTREAM har konfigurerats skapar du en SQL-tabell med FILESTREAM-kolumnerna för att lagra olika filer i SQL-servertabellen. Som jag nämnde ovan är FILESTREAM inte en datatyp. Det är ett attribut som vi lägger till i kolumnen varbinary(max) i den FILESTREAM-aktiverade tabellen. När du skapar en FILESTREAM-aktiverad tabell, se till att du lägger till en UNIQUEIDENTIFIER kolumn som har ROWGUIDCOL och UNIKA attribut.

Kör följande skript för att skapa en FILESTREAM-aktiverad tabell:

Use [FileStream_Demo]
go
Create Table [DummyDocuments]
(
    ID uniqueidentifier ROWGUIDCOL unique NOT NULL,
    RootDirectory varchar(max),
    FileName varchar(max),
    FileAttribute varchar(150),
    FileCreateDate datetime,
    FileSize numeric(10,5),
    FileStreamCol varbinary (max) FILESTREAM
)

Infoga data i tabell

Jag har WorldWide_Importors.xls dokument lagrat i datorn på platsen "E:\Documents". Använd OPENROWSET(Bulk) för att ladda dess innehåll från disken till VARBINARY(max) variabel. Lagra sedan variabeln i FileStreamCol (VARBINARY(max)) kolumnen i DummyDocumen t bord. För att göra det, kör följande skript:

Use [FileStream-Demo]
Go
DECLARE @Document AS VARBINARY(MAX)
 
-- Load the image data
SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX))
      FROM OPENROWSET(
            BULK
            'E:\Documents\WorldWide_Importors.xls',
            SINGLE_BLOB ) AS Doc
            
-- Insert the data to the table           
INSERT INTO [DummyDocuments] (ID, RootDirectory,FileName, FileAttribute, FileCreateDate,FileSize,FileStreamCol)
SELECT NEWID(), 'E:\Documents','WorldWide_Importors.xls','Raw',getdate(),10, @Document

Åtkomst till FILESTREAM-data

FILESTREAM-data kan nås genom att använda T-SQL och Managed API. När FILESTREAM-kolumnen nås med T-SQL-frågan, använder den SQL-minne för att läsa innehållet i datafilen och skicka data till klientapplikationen. När kolumnen FILESTREAM nås med Win32 Managed API, använder den inte SQL Server-minne. Den använder strömningskapaciteten hos NT-filsystemet vilket ger prestandafördelar.

Åtkomst till FILESTREAM-data med T-SQL

Som jag nämnde i början av artikeln är FILESTREAM ett attribut som tilldelas en tabellkolumn som har varbinary(max) datatyp, därför kan den nås som vilken annan kolumn som helst i tabellen. För att hämta FILESTREAM-data tillsammans med all information i tabellen, kör nedanstående fråga

Use [FileStream-Demo]
go
select RootDirectory,FileName,FileAttribute,FileCreateDate,FileSize,FileStreamCol from DummyDocuments

Nedan är resultatet av frågan:

Som visas i bilden ovan har dokumentet "WorldWide_Importors.xls" konverterats till en BLOB som lagras i kolumnen "FileStreamCol".

Åtkomst till FILESTREAM-data med Managed API

Även om åtkomst till FILESTREAM med Win32 API ger en prestanda och andra fördelar, men den har andra och svåra syntaxer än T-SQL-syntaxer vilket gör det svårt att komma åt data. För det första, för att lokalisera filen i FILESTREAMs datalager, måste vi identifiera den logiska sökvägen för att identifiera filen i FILESTREAMs datalager unikt. Vi kan göra det genom att använda Pathname() metoden för FILESTREAM-kolumnen. Det är skiftlägeskänsligt.

Efter att ha hämtat sökvägen till filen, för att komma åt, måste vi få transaktionskontext genom att använda Börja transaktion metod. När transaktionskontexten har erhållits kan vi komma åt den med SQLFileStream klass.

Koden nedan hämtar den lokala sökvägen till WorldWide_Importors.xls dokument i FILESTREAMs datalager.

SELECT 
      RootDirectory, 
	 FileName,
	 FileAttribute,
	 FileCreateDate,
	 FileSize,
      FileStreamCol.PathName() AS FilePath
FROM DummyDocuments

Frågeutgång:

Ta bort filer från FILESTREAM Container

Att ta bort filer är enkelt. Du måste köra raderingsfrågan för att ta bort filen från den FILESTREAM-aktiverade SQL-tabellen. Även om posten har raderats från tabeller kommer filen att finnas tillgänglig i FILSTREAMs datalager fysiskt. Den kommer att raderas av Garbage Collector. Garbage Collector-processen körs när checkpoint-händelsen inträffar. Genom att ange en explicit kontrollpunkt kan du radera den direkt efter att du tagit bort den från tabellen.

Fråga för att ta bort filer från SQL-tabell:

Use [FileStream_Demo]
go
delete from DummyDocuments where ID='0D640ABC-8CF1-41E0-9FA8-28171047129F'

Sammanfattning

I den här artikeln har jag täckt:

  1. Introduktion av FILESTREAM och vilka är fördelarna.
  2. Hur man aktiverar FILESTREAM-funktionen på SQL-serverinstansen.
  3. Skapa och konfigurera FILESTREAMs datalager och filgrupper.
  4. Utför Infoga och ta bort filer från FILESTREAMs datalager.

I framtida artiklar kommer jag att förklara:

  1. Hur man säkerhetskopierar och återställer FILESTREAM-aktiverad databas.
  2. Ställa in replikering och tabellportionering i FILESTREAM-tabeller.

Håll ögonen öppna!


  1. Databassäkerhet - Backup-kryptering under transport och i vila

  2. Hur konverterar man effektivt text till nummer i Oracle PL/SQL med icke-standard NLS_NUMERIC_CHARACTERS?

  3. SQLRecoverableException:I/O-undantag:Anslutningsåterställning

  4. Att skriva en fil med flera trådar