Announcement

Collapse
No announcement yet.

Invalid Blob Id

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Invalid Blob Id

    Interbase 6.5.0.28 Netzwerk, Delphi5, IBX 5.03, Datenbankreplikation
    Beim Update eines Datensatzes über Stored Procedure in einer Datenbank mit Daten aus einer anderen Datenbank tritt der Fehler "Invalid Blob ID" auf, aber nur bei einem bestimmten Proband/Firma. Die Daten werden immer im Block je Firma bearbeitet. Probanden in anderen Firmen lassen sich problemlos aktualisieren. Eine Änderung am Notiz (Blobfeld) ist nicht vorgenommen worden und die Wertezuweisungen zu den Feldern stimmt (der fehlerhafte Datensatz wird protokolliert). Eine Suche über gfix brachte keine Datenbankbeschädigung und damit weiß ich nun nicht weiter woran es liegen könnte, da der Datenbankabgleich schon seit ein paar Jahren eingesetzt wird. Einzige Besonderheit: Der Proband wurde nach über 3 Monaten zum ersten mal wieder an die Hauptdatenbank zurücküberspielt.
    Gruß Andreas

    create PROCEDURE UPDATE_PROBAND
    (
    PROBANDID INTEGER,
    FIRMAID INTEGER,
    NAME VARCHAR(30),
    VORNAME VARCHAR(30),
    GEBURTSNAME VARCHAR(30),
    STRASSE VARCHAR(50),
    PLZ VARCHAR(7),
    ORT VARCHAR(50),
    KK_ID INTEGER,
    HA_ID INTEGER,
    GESCHLECHT VARCHAR(1),
    GEBDATUM TIMESTAMP,
    BERUF1_ID INTEGER,
    BERUF2_ID INTEGER,
    RECORDSTATUS INTEGER,
    LETZTEVERAENDERUNGUSER VARCHAR(8),
    LETZTEVERAENDERUNGZEIT TIMESTAMP,
    RISIKO1_ID INTEGER,
    RISIKO2_ID INTEGER,
    RISIKO3_ID INTEGER,
    RISIKO4_ID INTEGER,
    TITEL VARCHAR(15),
    STAATSANGEHOERIGKEIT VARCHAR(30),
    VERSICHERTENNUMMER VARCHAR(12),
    EINSTELLDATUM TIMESTAMP,
    PERSNR INTEGER,
    KENNZEICHEN INTEGER,
    NOTIZ BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TELEFON VARCHAR(20),
    FAX VARCHAR(20),
    E_MAIL VARCHAR(40)
    )
    AS
    begin
    update Proband set FIRMAID = :FIRMAID, NAME = :NAME,
    VORNAME = :VORNAME, GEBURTSNAME = :GEBURTSNAME,
    STRASSE = :STRASSE, PLZ = :PLZ, ORT = :ORT, KK_ID = :KK_ID,
    HA_ID = :HA_ID, GESCHLECHT = :GESCHLECHT, GEBDATUM = :GEBDATUM,
    BERUF1_ID = :BERUF1_ID, BERUF2_ID = :BERUF2_ID,
    RECORDSTATUS = :RECORDSTATUS,
    LETZTEVERAENDERUNGUSER = :LETZTEVERAENDERUNGUSER,
    LETZTEVERAENDERUNGZEIT = :LETZTEVERAENDERUNGZEIT,
    RISIKO1_ID = :RISIKO1_ID, RISIKO2_ID = :RISIKO2_ID,
    RISIKO3_ID = :RISIKO3_ID, RISIKO4_ID = :RISIKO4_ID,
    TITEL = :TITEL, STAATSANGEHOERIGKEIT = :STAATSANGEHOERIGKEIT,
    VERSICHERTENNUMMER = :VERSICHERTENNUMMER, EINSTELLDATUM = :EINSTELLDATUM,
    PERSNR = :PERSNR, KENNZEICHEN = :KENNZEICHEN, NOTIZ = :NOTIZ,
    TELEFON = :TELEFON, FAX = :FAX, E_MAIL = :E_MAIL
    where PROBANDID = :PROBANDID ;
    end
    ^

  • #2
    Hallo Andreas,
    ich erinnere mich an einen Bug in InterBase, der bei der Verwendung von BLOBs in Stored Procedures nur die BLOB-ID kopiert und nicht den tatsächlichen Inhalt. So kann es z.B. sein, dass 2 Datensätze auf ein und die selbe BLOB-ID in einer BLOB-Seite (BLOB page) zeigen. Wird nun ein Datensätz gelöscht, wird nun auch das BLOB entfernt. Der zweite Datensatz zeigt nun ins leere und kann die von Dir geschilderte Fehlermeldung erhalten, wenn man auf diesen Datensatz zugreift. Ob das in neueren InterBase-Versionen gefixt wurde, kann ich Dir nicht sagen.
    <br>
    Schöne Grüße,
    Thoma
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Unter
      "http://forumarea.de/forum/viewtopic.php?p=1152&sid=32a5a9adadb1f8502fa6479f2 989ca03"
      hatte ich etwas gefunden zu dem Thema und ein Update auf Version 6.5.0.29 (von uns verwendete Version ist 6.5.0.28), leider geht der Link mit der Erklärung ins leere. Vielleicht ist damit der Bug behoben, aber wie bekomme ich jetzt die vorhandene Fehlermeldung weg (im Blob steht nichts drin, zumindest nicht bei dem Datensatz)? Aber um den Bug besser zu verstehen: wenn ich z.B. einen Datensatz über SP einfüge, dann kann es sein, dass die Blob-ID auf den Blob eines vorhandenen Datensatzes verweist, anstatt einen Blob anzulegen. Wird nun einer von den beiden Datensätzen gelöscht, dann kommt es beim Update des anderen zu der Fehlermeldung. Die Frage ist jetzt, ob es dann möglich ist bei einer Datenbankprüfung mit IB-ValidationServices [CheckDB, ValidateDB] diesen Fehler nicht festzustellen und was bei einem Backup / Restore der Datenbank mit dem Datensatz passiert, wenn das Restore problemlos durchläuft.
      Eine Lösung des Problems wäre sicher: den Datensatz, der eigentlich nur auf den neuesten Stand gebracht werden soll, zu löschen und dann wieder neu einzufügen.

      Gruß Andrea

      Comment

      Working...
      X