Frage

Ich habe eine Tabelle definiert (siehe code-snippet unten).Wie kann ich das hinzufügen einer Einschränkung oder was auch immer so, dass die LastUpdate Spalte wird automatisch aktualisiert, wenn die Zeile geändert wird?

CREATE TABLE dbo.Profiles
(
        UserName                                varchar(100)            NOT NULL,
        LastUpdate                              datetime                NOT NULL  CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
        FullName                                varchar(50)             NOT NULL,
        Birthdate                               smalldatetime           NULL,
        PageSize                                int                     NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
        CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
        CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE  
)
War es hilfreich?

Lösung

Eine default-Einschränkung funktioniert nur auf Einlagen;für ein update verwenden Sie einen trigger.

Andere Tipps

Ich Stimme mit den anderen -- stellen Sie den Standardwert GetDate() auf der LastUpdate Spalte und dann mit einem trigger-Griff-updates.

So etwas einfaches wie dieses:

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)

Wenn Sie es wirklich wünschen, haben Sie es bewerten, was ist geändert gegenüber dem, was in die Datenbank und ändern Sie nur LastUpdate ob es einen Unterschied.

Betrachten Sie dieses...

  • 7 - User 'jsmith' erstellt einen Nachnamen von 'Smithe' (oops), LastUpdate standardmäßig 7

  • 8 - 'jsmith' E-Mails an sagen, sein name ist falsch.Sie sofort das update durchzuführen, so dass der Letzte name ist jetzt 'Smith' und (durch den Auslöser) LastUpdate zeigt 8am

  • 2pm - Ihr slacker Mitarbeiter bekommt endlich gelangweilt mit StumbleUpon und überprüft seine E-Mail.Er sieht die frühere Botschaft von 'jsmith' in Bezug auf den Namen zu ändern.Er läuft: UPDATE Profile SET LastName='Smith' WHERE Username='jsmith' und dann geht zurück zum surfen MySpace.Die trigger kümmert sich nicht, dass der Letzte name war schon 'Smith', aber so LastUpdate jetzt zeigt 2pm.

Wenn Sie nur blind zu ändern, LastUpdate, wenn eine update-Anweisung ausgeführt wird, ist es TECHNISCH korrekt, weil ein update geschehen ist, aber es wohl mehr Sinn macht, um wirklich vergleichen Sie die änderungen, und handeln entsprechend.So, das 2pm Update-Anweisung durch die Mitarbeiter würden noch laufen, aber LastUpdate würde immer noch zeigen, 8am.

--Kevin

Ich Stimme mit der trigger-Idee, obwohl ich würde verwenden Sie eine Verknüpfung eingefügt, anstatt eine Unterabfrage.Ich möchte jedoch darauf hinweisen, dass Benutzername ist eine besonders schlechte Wahl für einen Primärschlüssel.Benutzernamen ändern sich oft, und wenn Sie Sie ändern müssen alle zugehörigen Tabellen.Es ist weit besser, eine Benutzer-id als Schlüssel und setzen Sie dann einen eindeutigen index für den Benutzernamen.Dann, wenn der user name geändert, Sie brauchen nicht, etwas anderes zu ändern.

Sind Sie gehen zu müssen, verwenden Auslöser für, dass.

Mein Vorschlag wäre, eine gespeicherte Prozedur erstellen, die standardmäßig die lastUpdate zu getdate().

Ich habe versucht zu vermeiden, löst in der Vergangenheit, weil die pre-SQL2005 finden und Bearbeiten Sie war ein Schmerz in den Hintern.Vor allem für Entwickler, die neu sind, zu Ihrem Projekt.

Auch hinzufügen, die als Standardwert für die Spalte definition.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top