none
abgelegte Files aus Filestream RRS feed

  • Frage

  • Hallo zusammen,

    ich habe nochmal eine Frage zum Filestream, diesmal im Zusammenhang um die Files zu einer Tabelle abgleichen zu können.

    Ein Programm verwendet den Filestream um Files abzulegen. In den Tabellen gibt es eine in der die ID (DataType uniqueidentifer) der Datei (es wird immer eine GUID pro Datei erzeugt) zur FileStreamID (DataType varbinary(MAX)) enthalten ist.

    Nun möchte die abgelegten Files gegen die Tabelle abgleichen, komme aber nicht auf den Dreh wie ich es machen kann.

    Beispiel:
    Für eine abzulegende Datei wird eine GUID erstellt, diese wäre im Beispiel 876f6951-12dc-4965-b968-986a400d550b. In der Tabelle für die eingelesenen Dateien wird nun diese ID abgelegt, im Feld varbinary sehe ich dann den Wert 0x74657374. Schaue ich dann im Data-Verzeichnis nach, erscheint dort die Datei mit namen 00000378-000001cc-004.

    Ich denke der Wert im varbinary steht im Zusammenhang mit den Dateinamen der abgelegten Datei, finde aber keinen Dreh wie ich aus dem Dateinamen auf den varbinary-Wert komme um zu prüfen, ob hierfür in der Tabelle der eingelesenen Dokumente ein Eintrag besteht.

    Vermutlich habe ich das System für den FileStream noch nicht verstanden, daher wollte ich Euch um Hilfe und Infos bitten, vieleicht bin ich auf dem falschen Weg?

    Viele Grüsse,
    Maxi

     

    Nachtrag:
    was ich erreichen will, ist eine Querprüfung der im Filesystem abgelegten Dateien aus dem Filestream zur Tabelle in der die Dateien eingetragen sind. Ich komme leider nicht darauf wie ich das ganze angehen kann, aus allem was ich gelesen, kanne ich keine Rückschlüsse ziehen dies zu verwirklichen.

    Samstag, 27. November 2010 14:22

Alle Antworten

  • Hallo MaxiTesch,

    wozu willst Du die Daten Tabelle/Filestream Share gegeneinander abgleich, traust Du dem SQL Server nicht ;-) ?

    Genau abgleichen kannst Du es eh nicht. Z.B. versioniert der SQL Server die Filestream Dateien: Wenn Du die Daten aktualisiert (update), wird eine neue Version angelegt. Löscht Du einen Datensatz, bleibt die Filestream-Datei zunächst vorhanden. Alte & gelöschte werden (bei Wiederherstellungsmodel Vollständig) erst nach der nächsten Sicherung entfernt, den die Filestream-Daten werden nicht im Log protokolliert, sondern eben über Dateien(-versionen).

    Den Ordnernamen, wo der Filestream zu einem Datensatz abgelegt ist, kannst Du mit der PathName ermitteln.


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Mittwoch, 1. Dezember 2010 10:08
  • Hallo Olaf,

    dem SQL traue ich schon, nur unseren Programmierern nicht :-)

    Ich habe jetzt bei mindestens drei Anwendungen erlebt das Where Close nicht korrekt geschrieben wird bzw StoredProcedures falsch angesprochen werden und dann die Einträge der Tabelle mit den Verweisen/Files mal eben "versehentlich" gelöscht werden.

    Hier wollte ich ansetzen und quasi eine ReverseCheck schreiben um so zu prüfen ob hier mal wieder was "falsch" gelaufen ist. Da die DB's auf vielen Rechnern installiert sind, möchte ich ein Tool haben (oder Query) die das macht.

    Was ich mir erlesen habe, der Filename ist quasi aus der laufenden Transaktionsnummer erstellt? Da gibt es wohl kein zurück mehr?

    Könnte man den das ldf-File suquenziell lesen und nur die Einträge lesen bei denen ein FileStream erzeugt bzw ein File abgelegt wurde? Ich könnte mir dann vorstellen alle Transaktionen nachzuvollziehen, zumindest müsste ich doch dann auf das File zur Tabelle schliessen können.

    Bin aber kein Profi, daher mal die laienhafte Frage :-)

    Viele Grüsse,
    Maximilian

    Mittwoch, 1. Dezember 2010 18:13
  • Hallo Maxi,

    wenn ich es richtig verstehe - kenne deine früheren Anfragen nicht - dann solltest du dir mal column_name.PathName(@option) anschauen.

    column_name 
                Der Spaltenname deiner varbinary(max) FILESTREAM-Spalte.

    @option

                0 = Gibt den in das BIOS-Format konvertierten Servernamen zurück
                1= Gibt den Servernamen ohne Konvertierung zurück
                2 = Gibt den vollständigen Servernamen zurück

    Samstag, 4. Dezember 2010 11:34
  •  

    Hi Maxi,

    diesmal eine Antwort im deutschen Forum, fällt doch bedeutend leichter sich in seiner Muttersprache zu verständigen.
    Wenn ich es richtig verstehe dann hast du die Dateien in einem Filesystem (Verzeichnis) vorliegen und möchtest dieses mit den Einträgen in der DB abgleichen.

    Dann schreibst du zunächst mal alle Dateien in eine temporäre Tabelle, z.B. mit


          create table #filenames (name varchar(200))

          set @sql ='xp_cmdshell "dir *.xyz /b"'

          insert #filenames exec (@sql)

    und mit Hilfe von pathname alle Dateien in der DB in eine andere. Und dann kannst du die Inhalte der beiden temp. Tabellen vergleichen.

    Montag, 6. Dezember 2010 07:15