2010-05-12 8 views
5

Ich möchte nur eine "ModifyDate" -Spalte automatisch für mich ausgefüllt haben, wenn ein Datensatz entweder eingefügt oder aktualisiert wird.SQL Server 2005 - Spalte "ModifyDate" - Verwendet eine berechnete Spalte eine korrekte Möglichkeit, dies zu implementieren?

Sollte ich Trigger verwenden oder ist es in Ordnung, eine berechnete Spalte zu verwenden?

(mit SSMS2005 und SQL Server 2005 Express)

+2

Eine berechnete Spalte wird ** nicht ** Arbeit. Wenn Sie den Wert einer berechneten Spalte auf GETDATE() setzen, wird immer das aktuelle Datum und nicht die letzte Aktualisierung zurückgegeben. – egrunin

+0

Wow, ich habe nicht erkannt, dass die berechnete Spalte auf einer Auswahl neu berechnet. Vielen Dank! –

+1

Was passiert, wenn der berechnete Wert beibehalten wird? –

Antwort

5

Der INSERTed-Teil ist einfach - definieren Sie einfach einen Standardwert für diese Spalte und geben Sie keinen Wert für diese Spalte an, wenn Sie eine neue Zeile einfügen.

Der UPDATE-Teil ist komplizierter - Sie müssen eine trigger that fires ON UPDATE schreiben und dann diese Spalte aktualisieren. Ich glaube nicht, dass es in SQL Server eine andere Möglichkeit gibt, dies zu tun.

Frage ist: Brauchen Sie wirklich das tatsächliche Datum des Kalenders? Falls nicht, wenn Sie nur einen "Marker" haben möchten, ob sich eine Zeile geändert hat oder nicht, sehen Sie sich stattdessen die ROWVERSION column type (früher bekannt als TIMESTAMP) an.

Ich sehe nicht wirklich, wie Sie eine berechnete Spalte dafür verwenden könnten - Sie müssen dieses Datum irgendwo speichern und es mit INSERT und jedem nachfolgenden UPDATE aktuell halten - nur ein Auslöser wird dies schaffen.

2

Ich nehme an, Sie eine Standardeinschränkung bedeuten, anstatt eine berechnete Spalte.

Wenn ja, ist das in Ordnung. Ich mache es lieber so. Ein möglicher Nachteil besteht darin, dass ein Client den Standardwert überschreiben kann. Wenn Sie dem Client jedoch nicht vertrauen, können Sie den Tabellenzugriff auch in gespeicherte Prozeduren umwandeln.

Trigger funktionieren auch, aber Trigger erzeugen tendenziell zusätzliche Komplexität. Codierungsfehler, die Trigger enthalten, gehören zu den schwierigsten Datenbankproblemen.

+2

Standardwerte helfen nicht beim Aktualisieren einer Zeile .... sie "feuern" nur, wenn der erste INSERT passiert .... –

3

Ich würde vorschlagen, weg von Triggern zu bleiben und setzen Sie die Date Modified Spalte mit einer gespeicherten Prozedur mit dem Server getDate Funktion.

Beispiel:

aktualisieren Kunden setzen Vorname = 'Jim', Name = 'Jones', DateModified = getDate()