SQL - Wie vergleichen Sie einen CLOB
in einer DB2-trigger, muss ich vergleichen, um den Wert von einem CLOB-Feld.
So etwas wie:
IF OLD_ROW.CLOB_FIELD != UPDATED_ROW.CLOB_FIELD
aber "!=" funktioniert nicht für den Vergleich von CLOBs.
Was ist der Weg, um es zu vergleichen?
Bearbeitet, um hinzufügen:
Mein trigger braucht, um zu tun, einige Maßnahmen, wenn der Clob-Feld geändert wurde, während ein update. Dies ist der Grund, warum ich brauchen, um zu vergleichen, die 2 CLOBs in der trigger-code.
Ich bin auf der Suche für einige detaillierte Informationen, wie dies gemacht werden kann,
- Dann sollten Sie wahrscheinlich halten @igelkott Antwort. Es ist wahrscheinlich der beste Weg. Berechnen Sie die neue MD5-Checksumme und vergleichen Sie mit der alten, und wenn Sie sich unterscheiden, CLOB geändert hat. Es gibt eine sehr kleine chance, dass es geändert und du hast die gleiche Prüfsumme - aber machen Sie sich keine sorgen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Oracle 10g, die Sie verwenden können, DBMS_LOB.compare () - API.
Beispiel:
Vollständige API:
Berechnen Sie die md5 (oder einer anderen) hash des clobs und dann vergleichen Sie diese. Ersten Berechnung wird langsam sein, aber der Vergleich ist schnell und einfach. Dies könnte eine gute Methode, wenn der Großteil Ihrer Daten nicht sehr Häufig ändern.
Eine Möglichkeit zum berechnen der md5 wird durch eine java-Anweisung in Ihr auslösen. Speichern Sie diese in der gleichen Tabelle (wenn möglich) oder erstellen Sie eine einfache Hilfstabelle.
Iglekott die Idee gut, mit einer Einschränkung:
Vorsichtig sein mit vergleichen von hash-wenn Ihre Daten wird wahrscheinlich angegriffen. Es ist derzeit nicht rechnerisch möglich zum generieren von hash-Kollisionen für eine bestimmte MD5-Wert, aber es ist möglich, erzeugen zwei verschiedene Eingaben, die den gleichen MD5 (also nicht auslösen-code). Es ist auch möglich, erzeugen zwei unterschiedliche strings mit dem gleichen Präfix, dass hash, um den gleichen Wert.
Wenn diese Art von Angriff kann dazu führen, die Integrität des Systems gefährdet, und das ist ein Anliegen, möchten Sie erkunden andere Optionen. Das einfachste wäre einfach die Umschaltung der hash-Funktionen SHA-2 nicht haben derzeit bekannte Sicherheitslücken.
Wenn dies nicht betreffen-zum Teufel, gehen mit CRC. Sie sind nicht für kryptographische Sicherheit hier. Nur nicht mit einem kryptographisch schwache Funktion, wenn diese Sachen installiert bekommen auf eine smartbomb, 'mkay? 🙂
Wenn die CLOBs sind 32 KB oder weniger, können Sie werfen Sie als VARCHAR, das ermöglicht den Vergleich, WIE, und verschiedene SQL-string-Funktionen.
Sonst, möchten Sie vielleicht zu prüfen, indem eine Spalte enthält den hash des CLOB und ändern Sie die Anwendung(en) zu halten, dass hash-up-to-date, wenn der CLOB aktualisiert.
Md5-Idee ist wahrscheinlich die beste, aber eine weitere alternative ist die Erstellung einer speziellen trigger wird nur ausgelöst, wenn Ihr CLOB-Feld aktualisiert wird.
Entsprechend der syntax-Diagramm, definieren Sie trigger wie:
Dies ist unter der Annahme, dass die Anwendung (oder wer auch immer, die Tabelle zu aktualisieren) ist smart genug, um update CLOB-Feld NUR, WENN es wurde eine änderung vorgenommen, um die clob-Feld, und nicht jedes mal, wenn Sie Ihre Tabelle ist aktualisiert.
Ich glaube, es ist nicht möglich, diese Art von Operatoren auf CLOB-Felder, wegen der Art, wie Sie gespeichert sind.
Nur erklären, sondern den Auslöser, um Feuer, falls bestimmte Spalte aktualisiert wird.
Generieren einen hash-Wert und vergleicht Sie ist der beste Weg IMHO.
Ist hier der ungetestete code:
Beachten Sie, dass Sie die EXECUTE-Privileg auf das DBMS_UTILITY-Modul. Weitere Informationen finden Sie über die bereitgestellten SQL-PL code in den folgenden links.
Tut DB2 verwenden
!=
denn nicht gleich? Die ANSI-SQL-Standard verwendet<>
für nicht gleich.