Question

J'ai une table définie (voir l'extrait de code ci-dessous).Comment puis-je ajouter une contrainte ou autre pour que la colonne LastUpdate soit automatiquement mise à 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  
)
Était-ce utile?

La solution

Une contrainte par défaut ne fonctionne que sur les insertions ;pour une mise à jour, utilisez un déclencheur.

Autres conseils

Je suis d'accord avec les autres : définissez une valeur par défaut de GetDate() sur la colonne LastUpdate, puis utilisez un déclencheur pour gérer les mises à jour.

Juste quelque chose de simple comme ceci :

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

Si vous voulez être vraiment sophistiqué, demandez-lui d'évaluer ce qui est modifié par rapport à ce qui se trouve dans la base de données et de modifier LastUpdate uniquement s'il y a une différence.

Considère ceci...

  • 7h du matin - L'utilisateur 'jsmith' est créé avec le nom de famille 'Smithe' (oups), LastUpdate est par défaut à 7h du matin.

  • 8h - 'jsmith' envoie un e-mail au service informatique pour lui dire que son nom est incorrect.Vous effectuez immédiatement la mise à jour, donc le nom de famille est désormais « Smith » et (grâce au déclencheur) LastUpdate affiche 8h du matin.

  • 14h - Votre collègue fainéant finit par s'ennuyer avec StumbleUpon et vérifie ses e-mails.Il voit le message précédent de « jsmith » concernant le changement de nom.Il court: MISE À JOUR des profils SET LastName='Smith' WHERE Username='jsmith' Et puis remonte à surfer Myspace.Cependant, le déclencheur ne se soucie pas du fait que le nom de famille était déjà « Smith », donc LastUpdate affiche désormais 14 heures.

Si vous modifiez aveuglément LastUpdate chaque fois qu'une instruction de mise à jour est exécutée, c'est TECHNIQUEMENT correct car une mise à jour a eu lieu, mais il est probablement plus logique de comparer les modifications et d'agir en conséquence.De cette façon, la déclaration de mise à jour à 14 heures du collègue serait toujours exécutée, mais LastUpdate afficherait toujours 8 heures du matin.

--Kévin

Je suis d'accord avec l'idée du déclencheur, même si j'utiliserais une jointure pour insérer au lieu d'une sous-requête.Cependant, je tiens à souligner que le nom d'utilisateur est un choix particulièrement mauvais pour une clé primaire.Les noms d'utilisateur changent souvent et lorsque c'est le cas, vous devez modifier toutes les tables associées.Il est de loin préférable d'avoir un identifiant utilisateur comme clé, puis de mettre un index unique sur le nom d'utilisateur.Ensuite, lorsque le nom d’utilisateur change, vous n’avez rien d’autre à changer.

Vous allez devoir utiliser des déclencheurs pour cela.

Ma suggestion serait de créer une procédure stockée qui définit par défaut lastUpdate sur getdate().

J'ai essayé d'éviter les déclencheurs dans le passé, car leur localisation et leur modification avant SQL2005 était une tâche ardue.Surtout pour les développeurs qui sont nouveaux dans votre projet.

Ajoutez-le également comme valeur par défaut pour la définition de votre colonne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top