Laden...

Jüngsten Datensatz aus einer History mit DateTime2 auslesen

Erstellt von Stipo vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.208 Views
Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren
Jüngsten Datensatz aus einer History mit DateTime2 auslesen

verwendetes Datenbanksystem: MS SQL Server 2008 Express

Halo zusammen,

ich hab ein kleines Problem, bei dem ich keinerlei Lösungsansatz finde.

Folgende Ausgangslage:
Ich möchte mittels einem DateTime2 eine History der Datensätze realisieren. Dazu habe eine Tabelle angelegt, in dem ich mit "GetDate()" das aktuelle Datum speichere.

Nun zu meinem Problem:
Ich hab mal so wirklich keine Idee, wie ich nun aus den Datensätzen, einen Datensatz filtern kann, der das jüngste Datum besitzt ( also der letzte gespeicherte Datensatz ).

Wenn mir mal einer einen Wink geben kann, nach was ich mich da informieren soll, dann hebe ich gerne meinen "im moment" leeren Kopf hin.

Grüße Stephan

B
13 Beiträge seit 2006
vor 14 Jahren

Moin,

sortiere doch einfach absteigend über das Datumsfeld
und lasse Dir den 1 Datensatz anzeigen:

select top 1 * from testtable order by datumsfeld desc

Bye und bis denne

Bitworm

3.511 Beiträge seit 2005
vor 14 Jahren

Ein DateTime(2) ist für sowas total ungeeignet. Benutze im SQL Server 2008 den Datentyp ROWVERSION. Dieser ist allerdings nicht im Designer des Management Studios zu finden. Die Spalten mit ROWVERSION musst du per Hand anlegen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

F
10.010 Beiträge seit 2004
vor 14 Jahren

Wobei RowVersion nur für die Versionierung einer einzelnen Row dient.
Das ist nicht das was Stipo will.

Ausserdem kann man die nicht abfragen, denn es ist zwar irendwie ein DT object,
aber es ist ein byte[].

@Stipo:
Du willst also eher soetwas wie AuditLogin machen.
Dazu gibt es gute Ansätze im Netz.

149 Beiträge seit 2006
vor 14 Jahren

Hallo Stipo,

der Ansatz von Bitworm ist schon garnicht schlecht. Solltest du jedoch noch weitere Information benötigen, wie z.B. wann der Datensatz das letzte mal von XY geändert wurde oder du wissen willst welcher Wert sich in einem Datensatz geändert hat, so kann ich dir empfehlen Change Data Capture (CDC) mal anzusehen.

Jeddoch verlange CDC das du die Enterpriseversion des SQL Servers benutzt. Alternative vorgehensweisen wären hier mit Triggern zu arbeiten. (Fehleranfällig!)

Viele Grüße
Robert

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo zusammen,
danke erstmal für die vielen Antworten.

Jeddoch verlange CDC das du die Enterpriseversion des SQL Servers benutzt. Alternative vorgehensweisen wären hier mit Triggern zu arbeiten. (Fehleranfällig!)

Ich habe mir zum Ziel gesetzt, das es mit freien Mitteln funktionieren sollte. Zum einen, da ich mir selbst keinen geeigneten SQL Server ( Develop / Enterprise ) leisten oder laden kann, zum anderen möchte ich mein System dann nicht an eine bestimmte Version binden.

Du willst also eher soetwas wie AuditLogin machen.
Dazu gibt es gute Ansätze im Netz.

Das eckt, wenn ich das richtig im Internet gefunden habe, auch mit dem SQL Express an, da es dort nicht unterstützt wird. Eines Blickes ist es allemal wert, aber dazu müsste ich mir dann den SQL Server kaufen in der passenden Version, was meinem Geldbeutel sehr weh machen würde.

sortiere doch einfach absteigend über das Datumsfeld
und lasse Dir den 1 Datensatz anzeigen:

select top 1 * from testtable order by datumsfeld desc

Danke für den Tip. Werde mir das mal ansehen. Das Schlüsselwort "TOP" kannte ich noch nicht.

Ich denke mal, das ich mit den jetzigen Antworten schon mal voran komme.
Danke nochmal an alle, die sich hier beteiligt haben.

Grüße Stephan

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo Khalid,

Ein DateTime(2) ist für sowas total ungeeignet.

Kannst Du mir das genauer erklären, warum ein DateTime(2) dafür ungeeignet sein soll? ( Soll jetzt nicht bedeuten, ich wüsste das besser. Stattdessen möchte ich lernen von Leuten die es besser wissen als ich es weiß )
Wenn ich das mit dem Beispiel von Bitworm versuche, dann bekomme ich genau das was ich wollte, das ich den letzten Datensatz erhalte.

Grüße Stephan

F
10.010 Beiträge seit 2004
vor 14 Jahren

@Stipo:
Wie, das eckt mir Express an?

Auditloggin wird meisst mit triggern gemacht, und das kann jeder server, auch Express.

149 Beiträge seit 2006
vor 14 Jahren

Hallo Stipo,

hier mal ein Beispiel für Audit Logging mit dem SQL Server 200. Was dort gezeigt wird geht auch mit dem SQL Server 2005/2008 Express. Man arbeitet im Prinzip mit Triggern die auf UPDATE, INSERT oder DELETE reagieren. Dazu erstellt man sich noch beliebige UDF (User Definied Functions) im SQL Server zu Unterstützung (z.B. aktuellen Benutzer auslesen, etc.).

Schau dir dieses Beispiel einfach mal an, da wird das Prinzip deutlich:

Table Auditing with SQL Server 2000

Ich hoffe dir damit geholfen zu haben.

Viele Grüße
Robert

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo roeb & FZelle,

danke noch für den Link und den Hinweiß. Ich hab mal das Beispiel aus dem Link nachgestellt, was auch scheinbar zu funktionieren scheint.
Nur verstehen tue ich das nicht. Trigger / Funktionen sind mir noch total unbekannt.
Die Syntax, wie man das umsetzt, erschließt sich mir noch nich so recht, kann aber sicher damit zusammenhängen, das ich bis jetzt hauptsächlich unter MySQL gearbeitet habe und das ich bis dato noch kein Buch über den SQL Server 2008 besitze.

Ich denke, das manko mit dem Buch muss ich schleunigst beheben, wenn ich erfolgreich mit dem SQL Server arbeiten möchte.

Grüße Stephan

PS: Über Tutorials und Grundlagenseiten in Deutsch freue ich mich immer.
Denn Ihr könnt das derzeit besser beurteilen, was gut und was eher nicht gut ist.

149 Beiträge seit 2006
vor 14 Jahren

Hallo Stipo,

wenn du ein gutes Buch zur Einführung in die Entwicklung mit dem SQL Server suchst, scha doch mal in meinen Blog. Ich habe da eine Buchtipp für eben Leute in deiner Situation geschrieben:

Buchempfehlung des Monats: Februar 2010

Ansonsten nur ganze kurz den Objekten im SQL Server die in diesem Beispiel zum Einsatz kommen.

Trigger:
Trigger reagieren auf Events (UPDATE, INSERT oder DELETE) auf genau einer Tabelle in einer Datenbank. Fügst du z.B. einen neuen Datensatz in die Tabelle Customer ein, so springt der Trigger für INSERT auf der Tabelle Customer an. Vorrausgesetzt du hast einen Trigger programmiert 😉

User Definied Function (UDF)
Am einfachsten kann man es wohl mit einer Methode in C# vergleichen. Du hast Code den du immer wieder verwendest, z.B. auslesen des angemeldeten Benutzers und des Anmeldezeit. Nun könntest du in jeden Trigger den Code immer wieder schreiben. Mit einer UDF schreibst du den Code einmal und rufst dann immer wieder diese UDF auf wenn du den Codesnippet benötigst. Eine UDF kann, muss aber nicht, Rückgabewerte haben. Dies können Scalarwerte oder Tables sein.

Ich hoffe dir damit erstmal die zwei Begriff näher gebracht zu haben.

Viele Grüße
Robert

Stipo Themenstarter:in
699 Beiträge seit 2007
vor 14 Jahren

Hallo Robert,

danke noch für die zusätzlichen Infos. Das Buch was Du mir vorschlägst, hört sich in deinem Blog ja sehr gut an, aber und das ist für mich entscheidend, sollte es auf Deutsch sein, da ich dem Englischen nicht flüssig genug folgen kann, also dem entsprechend wohl einen schlechten Lernerfolg erzielen würde.

[Buch]Empfehlung: Microsoft SQL Server 2008 da hab ich mal 3 Bücher rein geschrieben, welche ich in der Auswahl habe, eines davon zu kaufen.
Wenn Du davon eines Empfehlen kannst, oder eines als eher ungeeignet empfindest, würde mich dein Argument sehr freuen.

Trigger:
Trigger reagieren auf Events (UPDATE, INSERT oder DELETE) auf genau einer Tabelle in einer Datenbank. Fügst du z.B. einen neuen Datensatz in die Tabelle Customer ein, so springt der Trigger für INSERT auf der Tabelle Customer an. Vorrausgesetzt du hast einen Trigger programmiert 😉

User Definied Function (UDF)
Am einfachsten kann man es wohl mit einer Methode in C# vergleichen. Du hast Code den du immer wieder verwendest, z.B. auslesen des angemeldeten Benutzers und des Anmeldezeit. Nun könntest du in jeden Trigger den Code immer wieder schreiben. Mit einer UDF schreibst du den Code einmal und rufst dann immer wieder diese UDF auf wenn du den Codesnippet benötigst. Eine UDF kann, muss aber nicht, Rückgabewerte haben. Dies können Scalarwerte oder Tables sein.

Genau darum geht es, wie Du selbst schreibst Vorausgesetzt du hast einen Trigger programmiert suche ich die Literatur, welches mich diesem Wissen näher bringt 😉

Ansonsten bin ich gerade dabei mir die Webcast-Reihe SQL Server 2008 - Eine Einführung in den SQL Server von Microsoft anzusehen, was aber sicher kein Buch unnötig machen wird.

Grüße Stephan