Laden...

SQL und aktuellster Datensatz

Letzter Beitrag vor 17 Jahren 13 Posts 4.060 Views
SQL und aktuellster Datensatz

Hi,
ich speichere Dokumente in meine Datenbank. Nun möchte ich sowas wie eine Versionshistory machen. Im moment werden die Dokumente fortlaufend gesichert. Wie erriche ich nun, dass immer nur das zuletzt gespeicherte Dokument angezeigt wird? Könnte man dies vielleicht mit Datum + Uhrzeit hinbekommen?

Gruß

Mike

Nachtrag: nur nochmals zum Verständniss:

ich habe beispielsweise folgende Dateien in meiner DB:

a.txt
a.txt
b.html
c.doc
a.txt
b.html
a.txt
etc.

Nun möchte ich nur jeweils die aktuellsten anzeigen lassen.

Hi,

zu Deiner Tabelle ein DateTime Feld hinzufügen z.B. lastchanged
und das bei jedem Update bzw. Insert immer mit dem aktuellen
Datum und Uhrzeit füllen.
Dann beim Selekt immer Order By lastchanged desc und
der erst Datensatz ist der Aktuellste.

Cheers
LarsLovesDotNet

Alles was man sich vorstellen kann,kann man auch programmieren.

AODL- An OpenDocument LibraryAODL
WWW: www.OpenDocument4all.com

Noch einfacher als bei jedem UPDATE/INSERT Statment Datum & Zeit mit zugeben wäre es einen Trigger auf dem SQL Server zu erstellen. Dieser kann z.B. Datum & Zeit automatisch bei jeder Änderung setzen.

Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher. - Albert Einstein

Hi,
danke für die antworten. Habe zuerst larslovesdotnet Lösung versucht. Leider funktioniert die nicht. Es werden weiterhin alle Dateien angezeigt und nicht die aktuellste. Müsste es nicht group by heißen? Bin aber Anfänger.

@Chäsi,
hört sich interessant an. Kannst du mir dies näher erklären. Bin was SQL angeht eigentlich Anfänger 🙂

Hoffe ihr helft mir nochmals 🙂

Grüße
Mike

Ein Trigger ist eine sehr interessante Sache und ich kenne Ihn aus Firebird (ich arbeite nicht mit MS SQL).

So direkt für .NET und MS SQL habe ich nichts parat, aber das müsste dir auch weiterhelfen:

http://www.destructor.de/firebird/trigger.htm

Tach!

Vergibt Deine Tabelle keine Datensatz-ID? (z. B. Primärschlüssel). Dann lass Dir doch einfach immer den Datensatz mit der höchsten ID anzeigen.

Gruß
Guggsdu

Gruß
Guggsdu

Ich würde vielleicht eher eine Tabelle mit den aktuellen Dateien anlegen und eine Archivtabelle. In der Archivtabelle kannst du halt die ursprüngliche Version mit dem jeweiligen Datum speichern und in der Tabelle mit den aktuellen Daten kommt jeweils die neuste Version rein, da solltest du dann auch noch das Datum dazu speichern.

Beispiel:

Folgende Daten stehen in deiner Tabelle mit den aktuellen Daten.

Tabelle aktuell
ID - Datei - Datum
1 - a.txt - 17.10.2005 16:00:00
2 - b.txt - 16.10.2005 13:30:00

Wenn du nun beispielsweise die Datei b.txt änderst, die ja die ID 2 hat dann trägst du das was in der "Tabelle aktuell" drin steht ins Archiv, also

Tabelle Archiv
ID - Datei - Datum
2 - b.txt - 16.10.2005 13:30:00

Und die neue geänderte Datei trägst du halt in die Tabelle aktuell, die dann wie folgt aussieht:

Tabelle aktuell
ID - Datei - Datum
1 - a.txt - 17.10.2005 16:00:00
2 - b.txt - 18.10.2005 08:23:00

Das wäre dann wesentlich übersichtlicher denke ich.

In der Archivtabelle dürfte natürlich die ID kein Primärschlüssel sein, da die ID ja doppelt vorkommt, wenn die Datei mehrere Versionen besitzt. Aber das könnte man ja realisieren 😉

Hi,
vergebe schon einen Primärschlüssel. Nur das Problem ist, ich habe verschiedene Dateien von denen ich immer nur die neuste sehen möchte. Ist das mit reinem SQL überhaupt machbar?

Grüßle

Mike

Deswegen sollst du ja die "alten" Dateien in eine extra Archivtabelle legen und nicht alles in eine Tabelle machen...

Ansonsten könntest du zunächst einen Group By machen. Dann durchläufst du die Datensätze der ermittelten Dateien (Daten) und generierst einen SQL-Befehl der nach der jeweiligen Datei sucht.

Also für Dein Beispiel:

a.txt
a.txt
b.html
c.doc
a.txt
b.html
a.txt

erhälst du beim Group By:
a.txt
b.html
c.doc

Für dieses generierst du halt jeweils einen Befehl der nur den Datensatz mit dem höchten Datum zurück gibt...
Wenn du viele Daten in der DB hast, kann das jedoch ganz schön viel Zeit beanspruchen...

Hi,
ich habs nun anders gelöst. Fügte einfach ein weiteres Feld ein. Dieses Update ich wenn eine neue Datei eingefügt wird. Ist ziemlich einfach gehalten. Denke auch von der Performaze her ist es ok. Da eigentlich immer ein Update und anschließend in Insert gemacht wird.
Werd die mal mit einigen 1000 Testdateien überprüfen.

Grüßle
Mike

Hallo,

ich grabe mal diesen Thread aus, weil ich gerade völlig auf dem Schlauch stehe.

Zzt. schreibe ich ein Anwendung, die mit verschiedenen Datenbankservern zusammen arbeiten soll (MySQL, Oracle, Firebird und MS SQL 2005). Deshalb muss ich für diese Server auch die DB-Erstellungsscripts bauen. Für Oracle und Firebird habe ich die Teile fertig.

Für Oracle und Firebird nutze ich BEFORE UPDATE-Trigger um das "Geändert"-Datum des Datensatzes zu schreiben:

Oracle:

CREATE OR REPLACE TRIGGER TRIG_USERDATA_UPDATE
BEFORE UPDATE ON USERDATA FOR EACH ROW
BEGIN
   :new.DATE_CHANGED := SYSDATE;
END;

Firebird:

CREATE TRIGGER TRIG_USERDATA_UPDATE FOR USERDATA
ACTIVE BEFORE UPDATE POSITION 0
as
begin
   new.DATE_CHANGED = 'NOW';
end

Aber beim MS SQL Server 2005 vermisse ich diese Trigger. Nun zum Zitat:

Original von Chäsi
Noch einfacher als bei jedem UPDATE/INSERT Statment Datum & Zeit mit zugeben wäre es einen Trigger auf dem SQL Server zu erstellen. Dieser kann z.B. Datum & Zeit automatisch bei jeder Änderung setzen. Diesem Zitat nach, sollte mein Wunsch auch mit dem SQL Server zu erfüllen sein. Der Trigger sieht monentan so aus (gibt aber Mecker vom Server - inserted kann nicht aktualisiert werden)

CREATE TRIGGER TRIG_USERDATA_UPDATE
ON USERDATA FOR UPDATE
AS
   UPDATE inserted SET DATE_CHANGED = GETDATE();

Wie muss ich den Trigger gestalten, damit ich mein "Geändert"-Datum bekomme?

Gruß
Morpheus

Hallo Morpheus,

Dein Vorhaben ist mit dem SQL-Server 2005 realisierbar. Inserted kann nicht aktualisiert werden, da es eine virtuelle Tabelle ist. Du musst ein normales Update-Statement verwenden und mittels einem WHERE auf den Primary Key (oder sonstwas eindeutiges) verweisen, um den richtigen Datensatz zu erwischen:

CREATE TRIGGER TRIG_USERDATA_UPDATE
ON USERDATA FOR UPDATE
AS
   UPDATE Tabelle SET Spalte = GETDATE() WHERE ID = (SELECT ID FROM Inserted);

Das sollte machen, was Du willst.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

Hallo Fabian,

vielen Dank für den Tipp.

Und wieder einmal wurde die Kausalität zwischen dem Erkennen des Waldes und dem Sehen von Bäumen empisch nachgewiesen.... 🤔

Gruß
Morpheus