Ich habe einige Tabellen, für die ich Daten versionieren möchte. Soweit es das Design betrifft, sind dies nur Einfügetische. Die Tische sind so etwas wie diesDatenversionierung mit Oracle
TABLENAME
----------
SURROGATE_KEY_ID
USER_VISIBLE_NATURAL_KEY_ID
VERSION
VALUE
Was ich will, ist für immer, wenn ich ein Datensatz einfügen, sollte der neue Datensatz eine Version, die für einen gegebenen USER_VISIBLE_NATURAL_KEY_ID Satz einer größer als die vorherige max-Version. Meine Wünsche für Version ist es, neue Daten aus alten Daten zu erzählen, während die alten Daten erhalten bleiben. Sie wissen, Standard-Verlaufsverfolgung, Audit etwas Zeug.
ich einen Auslöser wie
CREATE OR REPLACE TRIGGER TABLENAME_TRIGGER
BEFORE INSERT ON TABLENAME
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
LATEST VERSION NUMBER;
BEGIN
SELECT NVL(MAX(VERSION), 0) INTO LATEST_VERSION FROM TABLENAME
WHERE TABLE_NAME.USER_VISIBLE_NATURAL_KEY_ID = :NEW.USER_VISIBLE_NATURAL_KEY_ID;
:NEW.VERSION = LATEST_VERSION +1;
END;
versucht, einen mutierenden Tabellenfehler Das gibt mir, nehme ich an, weil ich versuche, in Tablename spähen die max (Version) zu finden, während eine neue Zeile einzufügen.
Wie kann ich diesen Ansatz funktionieren lassen, oder wenn ich total falsch liege, was ist ein besserer Ansatz?
Wie wäre es eine unabhängige Sequenz schlagen automatisch die 'VERSION' Spalte zu füllen? Die 'VERSION'-Spalte wird unabhängig von Lücken eine Reihenfolge für eine 'USER_VISIBLE_NATURAL_KEY_ID' bereitstellen. Warum muss "VERSION" der nächste Wert und nicht einfach ein größerer Wert sein? – Glenn
Das ist eine interessante Idee. Wie würden Sie vorschlagen, mit der Sequenzübergabe umzugehen? Beachten Sie, wenn es passiert und archivieren Sie alte Daten davor? – monknomo
Wenn es jemals einen Rollover gibt, erstelle ich normalerweise eine 2-teilige Kennung basierend auf dem Datum und der Reihenfolge. Dann nach der ID, Timestamp, Seq. Legen Sie den Datums-/Zeitstempel auf eine geeignete Granularität fest, und Sie müssen sich keine Gedanken über den Sequenz-Rollover machen. – Glenn