SQL Server 2005 mise à jour automatique DateTime Column - LastUpdated
J'ai une table définie (voir l'extrait de code ci-dessous). Comment puis-je ajouter une contrainte ou que ce soit, de sorte que le LastUpdate colonne est automatiquement mis à jour chaque fois que la ligne est modifiée?
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
)
source d'informationauteur Brian Boatright
Vous devez vous connecter pour publier un commentaire.
un défaut de contrainte ne fonctionne que sur les plaquettes, pour une mise à jour, utilisez un déclencheur
Je suis d'accord avec les autres -- définir une valeur par défaut de la fonction GetDate() sur le LastUpdate colonne et ensuite utiliser un déclencheur pour gérer les mises à jour.
Juste quelque chose de simple comme ceci:
Si vous voulez vraiment faire de la fantaisie, de les faire évaluer ce qui est modifié par rapport à ce qui est dans la base de données et modifier uniquement les LastUpdate si il y a une différence.
Considérer cette...
7h - Utilisateur "jdupont" est créé avec un nom de famille de "Smithe' (oups), LastUpdate par défaut à 7h du matin
8h - 'jsmith' e-mails à dire son nom est incorrect. Vous procéder immédiatement à la mise à jour, de sorte que le dernier nom est maintenant "Smith" et (grâce à la gâchette) LastUpdate montre 8h
2pm - Votre slacker collègue, enfin, s'ennuie avec StumbleUpon et vérifie son courrier. Il voit le message précédent de "jdupont" concernant le changement de nom. Il s'exécute: mise à JOUR des Profils SET Nom='Dupont' where Username='jsmith' et puis s'en va
retour sur MySpace. Le déclencheur ne se soucie pas que le dernier nom était déjà "Smith", cependant, de sorte LastUpdate montre maintenant 2pm.
Si vous venez de aveuglément changement LastUpdate chaque fois qu'une instruction de mise à jour s'exécute, il est TECHNIQUEMENT correcte, car une mise à jour a bien eu lieu, mais il a probablement fait plus de sens que de comparer réellement les changements et agir en conséquence. De cette façon, les 2pm instruction de mise à Jour par le collègue serait encore long, mais LastUpdate encore 8h.
--Kevin
Je suis d'accord avec le déclencheur d'idée, mais je voudrais utiliser une jointure pour insérée à la place d'une sous-requête. Cependant, je tiens à signaler que le nom d'utilisateur est particulièrement mauvais choix pour une clé primaire. Les noms d'utilisateur changent souvent et quand ils le font, vous devez changer toutes les tables associées. Il est de loin préférable d'avoir un user id comme clé et ensuite mettre un index unique sur le nom d'utilisateur. Ensuite, lorsque l'utilisateur change de nom, vous n'avez pas besoin de changer quoi que ce soit d'autre.
Vous allez avoir à utiliser des déclencheurs pour que.
Ma suggestion serait de créer une procédure stockée qui, par défaut, le lastUpdate getdate().
J'ai essayé d'éviter les déclencheurs dans le passé en raison de la pré-SQL2005 la localisation et de l'édition a été une douleur dans la croupe. Surtout pour les développeurs qui sont nouveaux à votre projet.
Également ajouter que comme valeur par défaut pour votre définition de la colonne.