sql >> Database teknologi >  >> RDS >> Database

Lagring af filer i SQL-database ved hjælp af FILESTREAM – Del 1

FILESTREAM er blevet introduceret af Microsoft i 2008. Formålet var at gemme og administrere ustrukturerede filer mere effektivt. Før FILESTREAM blev introduceret, blev følgende fremgangsmåder brugt til at gemme dataene i SQL-serveren:

  1. Ustrukturerede filer kan gemmes i VARBINARY- eller IMAGE-kolonnen i en SQL Server-tabel. Denne tilgang er effektiv til at opretholde transaktionskonsistens og reducerer filhåndteringskompleksiteten, men når klientapplikationen læser data fra SQL-tabellen, bruger den SQL-hukommelse, hvilket fører til dårlig ydeevne.
  2. I stedet for at gemme hele filen i SQL-tabellen, skal du gemme den fysiske placering af den ustrukturerede fil i SQL-tabellen. Denne tilgang giver en enorm ydeevneforbedring, men den sikrer ikke transaktionskonsistensen, og filhåndteringen var også vanskelig.

FILESTREAM-funktionen er meget effektiv, fordi den tillader lagring af BLOB-filer i NT-filsystemet og opretholder transaktionskonsistensen. Når en klientapplikation læser data fra FILESTREAM-beholderen, i stedet for at bruge hukommelsen i SQL Server-bufferen, bruger den Nthe T-systemcachen, hvilket forbedrer ydeevnen.

FILESTREAM er ikke en datatype. Det er en egenskab, som kan tildeles til kolonnen VARBINARY(MAX). Når VARBINARY(MAX)-kolonnen er tildelt til FILESTREAM-attributten, kaldes den en FILESTREAM-kolonne. Data, der er gemt i FILESTREAM-kolonnen, vil blive gemt i NT-systemet som en diskfil, og markøren for filen gemmes i tabellen. Kolonnen VARBINARY(max) med FILESTREAM-attributten tildelt har ikke en begrænsning på lagring af 2 GB i tabellen. Derfor kan vi også gemme store filer.

I denne artikel vil jeg demonstrere som følger:

  1. Sådan aktiverer du FILESTREAM-funktionen.
  2. Sådan opretter og konfigurerer du FILESTREAM-filgrupper og FILESTREAM-databeholder.
  3. Sådan gemmer og får du adgang til data fra de FILESTREAM-aktiverede tabeller.

Demo:

I denne demo vil jeg bruge:

  1. Databaseserver :SQL Server 2017
  2. Software :SQL Server Management Studio
  3. Database :FileStream_Demo

Konfigurer FILESTREAM Access i SQL Server-database

For at konfigurere FileStream i SQL Server skal du foretage følgende ændringer til SQL Server.

  1. Aktiver FILESTREAM-funktionen fra SQL Server Configuration Manager.
  2. Aktiver FILESTREAM-adgangsniveauet på SQL Server-instansen.
  3. Opret en FILESTREAM-filgruppe og en FileStream-beholder til at gemme BLOB-data.

Aktiver FILESTREAM-funktionen

For at aktivere FileStream på enhver database skal du først aktivere FileStream-funktionen på SQL Server-instansen. For at gøre det skal du åbne SQL Server Configuration Manager, højreklikke på SQL Instance, vælge Egenskaber , som vist på følgende billede:

En dialogboks til at konfigurere serveregenskaber åbnes. Skift til FILESTREAM fanen. Vælg Aktiver FILESTREAM for T-SQL-adgang . Vælg Aktiver FILESTREAM for I/O-adgang og vælg derefter Tillad ekstern klientadgang til FILESTREAM-data . I Windows-delingsnavnet tekstboks, angiv et navn på mappen til at gemme filerne. Se følgende billede:

Klik på OK, og genstart SQL-tjenesten.

Aktiver FILESTREAM-adgangsniveau på SQL Server-instans

Når FILESTREAM-funktionen er aktiveret, skal du ændre FILESTREAM-adgangsniveauet. For at ændre FileStream-adgangsniveauet skal du udføre følgende forespørgsel:

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

I ovenstående forespørgsel er parametrene nedenfor gyldige værdier:

0 betyder FILESTREAM-understøttelsen af ​​SQL-instansen er deaktiveret.

1 betyder FILESTREAM-understøttelsen af ​​T-SQL er aktiveret.

2 betyder FILESTREAM-understøttelsen af ​​T-SQL- og Win32-streamingadgang er aktiveret.

Du kan ændre FILESTREAM-adgangsniveauet ved hjælp af SQL Server Management Studio. For at gøre det skal du højreklikke på en SQL Server-forbindelse>> vælg Egenskaber>> I dialogboksen serveregenskaber skal du vælge FileStream Access Level fra rullemenuen, og vælg Fuld adgang aktiveret , som vist på følgende billede:

Når parameteren er ændret, genstart SQL Server-tjenester.

Tilføj FILESTREAM filgruppe og datafiler

Når FILESTREAM er aktiveret, skal du tilføje FILESTREAM-filgruppen og FILESTREAM-beholderen.

For at gøre det skal du højreklikke på FileStream-Demo database>> vælg Egenskaber>> I en venstre rude i Databaseegenskaber dialogboksen, vælg Filgrupper>> Klik på Tilføj filgruppe i FILESTREAM-gitteret knap> > Navngiv filgruppen som Dummy-dokument . Se følgende billede:

Når filgruppen er oprettet, skal du i dialogboksen Databaseegenskaber vælge filer og klik på knappen Tilføj. Databasefiler-gitteret aktiverer. Angiv navnet i kolonnen Logisk navn – Dummy-Document . Vælg FILESTREAM Data i Filtype drop-down boks. Vælg Dummy-Document i Filgruppen kolonne. I stien kolonne, angive den mappeplacering, hvor filerne vil blive gemt (E:\Dummy-Documents). Se følgende billede:

Alternativt kan du tilføje FILESTREAM-filgruppen og containerne ved at udføre følgende T-SQL-forespørgsel:

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

For at bekræfte, at FileStream-beholderen er blevet oprettet, skal du åbne Windows Stifinder og navigere til mappen "E:\Dummy-Document".

Som vist i ovenstående billede, mappen $FSLOG og filestream.hdr fil er blevet oprettet. $FSLOG er ligesom SQL server T-Log og filestream.hdr indeholder metadata for FILESTREAM. Sørg for, at du ikke ændrer eller redigerer disse filer.

Gem filer i SQL-tabel

I denne demo vil vi oprette en tabel til at gemme forskellige filer fra computeren. Tabellen har følgende kolonner:

  1. "RootDirectory ” kolonne for at gemme filplacering.
  2. "Filnavn ” kolonne for at gemme navnet på filen.
  3. "FileAttribute ” kolonne for at gemme filattribut (Raw/Directory.
  4. "FileCreateDate ” kolonne for at gemme filoprettelsestid.
  5. "Filstørrelse ”-kolonnen for at gemme filens størrelse.
  6. "FileStreamCol ” kolonne for at gemme indholdet af filen i det binære format.

Opret en SQL-tabel med en FILESTREAM-kolonne

Når FILESTREAM er konfigureret, skal du oprette en SQL-tabel med FILESTREAM-kolonnerne for at gemme forskellige filer i SQL-servertabellen. Som jeg nævnte ovenfor, er FILESTREAM ikke en datatype. Det er en attribut, som vi tilføjer til varbinary(max)-kolonnen i den FILESTREAM-aktiverede tabel. Når du opretter en FILESTREAM-aktiveret tabel, skal du sørge for at tilføje en UNIQUEIDENTIFIER kolonne, der har ROWGUIDCOL og UNIKK attributter.

Udfør følgende script for at oprette en FILESTREAM-aktiveret tabel:

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
)

Indsæt data i tabel

Jeg har WorldWide_Importors.xls dokument gemt på computeren på "E:\Documents"-lokationen. Brug OPENROWSET(Bulk) for at indlæse indholdet fra disken til VARBINARY(max) variabel. Gem derefter variablen i FileStreamCol (VARBINARY(max)) kolonne i DummyDocumen t bord. For at gøre det skal du køre følgende script:

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

Få adgang til FILESTREAM-data

FILESTREAM-dataene kan tilgås ved at bruge T-SQL og Managed API. Når FILESTREAM-kolonnen tilgås ved hjælp af T-SQL-forespørgsel, bruger den SQL-hukommelse til at læse indholdet af datafilen og sende dataene til klientapplikationen. Når FILESTREAM-kolonnen tilgås ved hjælp af Win32 Managed API, bruger den ikke SQL Server-hukommelse. Den bruger NT-filsystemets streaming-kapacitet, hvilket giver ydeevnefordele.

Få adgang til FILESTREAM-data ved hjælp af T-SQL

Som jeg nævnte i begyndelsen af ​​artiklen, er FILESTREAM en attribut, der er tildelt en tabelkolonne, der har varbinary(max) datatype, derfor kan den tilgås som enhver anden kolonne i tabellen. For at hente FILESTREAM-data sammen med alle oplysninger i tabellen skal du udføre nedenstående forespørgsel

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

Nedenfor er resultatet af forespørgslen:

Som vist på billedet ovenfor, er "WorldWide_Importors.xls"-dokumentet blevet konverteret til en BLOB, der er gemt i kolonnen "FileStreamCol".

Få adgang til FILESTREAM-data ved hjælp af Managed API

Selvom adgang til FILESTREAM ved hjælp af Win32 API giver en ydeevne og andre fordele, men det har andre og vanskelige syntakser end T-SQL syntakser, hvilket gør det vanskeligt at få adgang til data. For det første, for at finde filen på FILESTREAM-datalageret, skal vi identificere den logiske sti til at identificere filen i FILESTREAM-datalageret entydigt. Vi kan gøre det ved at bruge Pathname() metode til FILESTREAM kolonne. Der skelnes mellem store og små bogstaver.

Efter at have hentet stien til filen, for at få adgang, skal vi opnå transaktionskontekst ved at bruge Begynd transaktion metode. Når transaktionskonteksten er opnået, kan vi få adgang til den ved hjælp af SQLFileStream klasse.

Koden nedenfor henter den lokale sti til WorldWide_Importors.xls dokument i FILESTREAM-datalageret.

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

Forespørgselsoutput:

Slet filer fra FILESTREAM Container

Sletning af filer er ligetil. Du skal køre sletteforespørgslen for at fjerne filen fra den FILESTREAM-aktiverede SQL-tabel. Selvom posten er blevet slettet fra tabeller, vil filen være fysisk tilgængelig i FILSTREAM-datalageret. Det vil blive slettet af Garbage Collector. Garbage Collector-processen udføres, når checkpoint-hændelsen indtræffer. Ved at give et eksplicit kontrolpunkt, kan du slette det umiddelbart efter sletning fra tabellen.

Forespørgsel om at slette filer fra SQL-tabel:

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

Oversigt

I denne artikel har jeg dækket:

  1. Introduktion af FILESTREAM og hvad er fordelene.
  2. Sådan aktiverer du FILESTREAM-funktionen på SQL-serverinstansen.
  3. Opret og konfigurer FILESTREAM-datalageret og filgrupperne.
  4. Udfør Indsæt og slet filer fra FILESTREAM-datalageret.

I fremtidige artikler vil jeg forklare:

  1. Sådan sikkerhedskopieres og gendannes FILESTREAM-aktiveret database.
  2. Opsætning af replikering og tabelportionering i FILESTREAM-tabeller.

Hold dig opdateret!


  1. Rådgivning ved brug af pivottabel i Oracle

  2. Hvordan anvender man en funktion til hvert element i en matrixkolonne i Postgres?

  3. DATEPART() Eksempler i SQL Server

  4. Forøg VOTE-diskgruppe i ASM til GI 12.2-opgradering