Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

FILESTREAM z SSIS

Termin Definicja
FILESTREAM z SSIS

FILESTREAM z SSIS opisuje sposób wykorzystania tego mechanizmu w pakietach usług integracyjnych SQL Server.

Rola FILESTREAM w architekturze SQL Server

FILESTREAM to funkcja konkretnego silnika Microsoft SQL Server, która pozwala przechowywać dane binarne powiązane z wierszem tabeli w systemie plików NTFS, przy zachowaniu kontroli transakcyjnej bazy danych. W tabeli kolumna przeznaczona do takiego przechowywania ma typ varbinary(max) i atrybut FILESTREAM. SQL Server przechowuje w bazie metadane oraz logiczne powiązanie z plikiem, natomiast właściwa zawartość może znajdować się w specjalnym kontenerze FILESTREAM należącym do grupy plików oznaczonej klauzulą CONTAINS FILESTREAM.

Do utworzenia tabeli z kolumną FILESTREAM potrzebny jest również klucz ROWGUIDCOL z ograniczeniem UNIQUE. Ten identyfikator pozwala silnikowi jednoznacznie powiązać rekord z obiektem przechowywanym w kontenerze FILESTREAM. Funkcję trzeba włączyć na poziomie instancji SQL Server, a następnie skonfigurować dla konkretnej bazy danych, wskazując kontener FILESTREAM. Samo dodanie kolumny binarnej bez tej konfiguracji nie powoduje użycia FILESTREAM.

Przenoszenie obiektów FILESTREAM w pakietach SSIS

SSIS, czyli SQL Server Integration Services, może uczestniczyć w przepływie danych zawierających wartości z kolumn FILESTREAM. Pakiet może pobierać rekordy przez komponent OLE DB Source, ADO.NET Source albo zapytanie wykonane w zadaniu SQL, a następnie przekazywać zawartość binarną do kolejnego komponentu. W typowym przepływie kolumna jest traktowana jako dane binarne, na przykład jako typ SSIS DT_BYTES albo typ odpowiadający danym typu obrazowego, zależnie od użytego dostawcy i metody mapowania.

Ważne jest rozróżnienie pomiędzy odczytem wartości binarnej przez interfejs SQL a bezpośrednim strumieniowaniem pliku z systemu plików. Zwykły komponent źródłowy SSIS może pobrać zawartość przez zapytanie SQL i umieścić ją w buforze przepływu danych. W takim wariancie pakiet korzysta z warstwy dostępu do SQL Server, a nie bezpośrednio z natywnego strumienia Win32 FILESTREAM. Przy dużych obiektach może to zwiększyć zużycie pamięci, czas transferu i liczbę operacji kopiowania.

Jeżeli wymagane jest natywne strumieniowanie, aplikacja lub własny komponent SSIS może użyć interfejsu SqlFileStream. Ten mechanizm wymaga uzyskania ścieżki logicznej z kolumny FILESTREAM, tokenu transakcji oraz aktywnej transakcji SQL Server. Odczyt lub zapis przez SqlFileStream odbywa się w kontekście transakcji, dlatego nie jest to prosty dostęp do przypadkowej ścieżki katalogu kontenera. Pliki w kontenerze FILESTREAM nie powinny być otwierane ani modyfikowane bezpośrednio przez system plików.

Projekt przepływu danych i obsługa transakcji

Pakiet SSIS zapisujący dane do tabeli FILESTREAM musi dostarczyć zarówno zawartość binarną, jak i poprawny identyfikator wiersza. W praktyce przepływ może obejmować źródło danych, transformację normalizującą typ kolumny, komponent docelowy SQL Server oraz obsługę błędnych rekordów. Mapowanie powinno zachować pełną wartość binarną; konwersja do tekstu, obcięcie bufora albo niejawna zmiana kodowania może uszkodzić zawartość pliku.

Przy operacjach wymagających spójności pomiędzy metadanymi i plikiem trzeba uwzględnić zakres transakcji. Sam zapis do kolumny FILESTREAM przez standardowy komponent docelowy może być wystarczający dla prostego ładowania danych, lecz scenariusz natywnego strumieniowania wymaga świadomego zarządzania transakcją i tokenem FILESTREAM. Jeżeli pakiet wykonuje kilka powiązanych operacji, należy ustalić, czy powinny zostać zatwierdzone razem, czy też mogą być niezależnymi partiami.

Wydajność zależy od rozmiaru obiektów, wielkości bufora SSIS, ustawień punktów kontrolnych, liczby równoległych ścieżek oraz sposobu użycia dostawcy danych. Dla dużych plików korzystniejsze może być ograniczenie liczby kopii w pamięci i zastosowanie komponentu niestandardowego korzystającego z natywnego strumienia. Dla mniejszych wartości prostszy przepływ przez zapytanie SQL bywa łatwiejszy do monitorowania. W obu przypadkach trzeba ustalić sposób ponawiania błędnych rekordów, aby ponowne uruchomienie nie tworzyło duplikatów.

Diagnostyka problemów FILESTREAM z SSIS

Podczas diagnozowania błędów należy najpierw sprawdzić, czy FILESTREAM jest włączony na instancji SQL Server i w bazie, czy baza ma grupę plików FILESTREAM oraz czy tabela spełnia wymagania dotyczące kolumny ROWGUIDCOL. Następnie warto zweryfikować używany sterownik, wersję dostawcy SQL Server, typ danych widziany przez SSIS i rzeczywiste mapowanie kolumn. Błąd może wynikać nie z samego pliku, lecz z tego, że komponent otrzymuje tekst, wartość NULL albo bufor o niewystarczającym rozmiarze.

W scenariuszu wykorzystującym SqlFileStream trzeba sprawdzić także dostępność udziału FILESTREAM, poprawność ścieżki zwróconej przez SQL Server, aktywność transakcji i ważność tokenu. Token jest związany z transakcją, więc użycie go po jej zatwierdzeniu, wycofaniu albo zamknięciu połączenia może zakończyć się błędem dostępu. Konto uruchamiające pakiet musi mieć odpowiednie uprawnienia do bazy oraz do mechanizmu FILESTREAM, ale nie należy nadawać mu dostępu do fizycznego kontenera w celu ręcznej edycji plików.

W środowisku produkcyjnym warto rejestrować identyfikator rekordu, rozmiar przesyłanego obiektu, czas odczytu i zapisu, liczbę ponowień oraz komunikat dostawcy. Takie dane pozwalają odróżnić błąd konfiguracji SQL Server od przeciążenia bufora SSIS, problemu z transakcją albo niezgodności sterownika. Kontrola po zakończeniu pakietu powinna porównywać liczbę rekordów, sumy rozmiarów i ewentualnie skróty plików, ponieważ sam status zakończenia zadania nie potwierdza integralności każdej wartości FILESTREAM.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę