Domanda

Ho una tabella definita (vedi snippet di codice di seguito).Come posso aggiungere un vincolo o altro in modo che la colonna LastUpdate venga aggiornata automaticamente ogni volta che la riga viene modificata?

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  
)
È stato utile?

Soluzione

Un vincolo predefinito funziona solo sugli inserimenti;per un aggiornamento utilizzare un trigger.

Altri suggerimenti

Sono d'accordo con gli altri: imposta un valore predefinito di GetDate() nella colonna LastUpdate e quindi utilizza un trigger per gestire eventuali aggiornamenti.

Solo qualcosa di semplice come questo:

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

Se vuoi essere davvero fantasioso, chiedigli di valutare cosa viene modificato rispetto a cosa c'è nel database e modifica LastUpdate solo se c'era una differenza.

Considera questo...

  • 7:00 - L'utente "jsmith" viene creato con il cognome "Smithe" (oops), LastUpdate per impostazione predefinita è alle 7:00

  • 8 del mattino - "jsmith" invia un'e-mail all'IT per dire che il suo nome non è corretto.Esegui immediatamente l'aggiornamento, quindi il cognome ora è "Smith" e (grazie al trigger) LastUpdate mostra 8:00

  • 14:00 - Il tuo collega fannullone finalmente si annoia con StumbleUpon e controlla la sua posta elettronica.Vede il messaggio precedente di "jsmith" riguardante il cambio di nome.Lui corre: AGGIORNA Profili SET Cognome='Smith' DOVE Nome utente='jsmith' E poi torna a navigare Myspace.Tuttavia, al trigger non interessa che il cognome fosse già "Smith", quindi LastUpdate ora mostra 14:00.

Se modifichi ciecamente LastUpdate ogni volta che viene eseguita un'istruzione di aggiornamento, è TECNICAMENTE corretto perché è avvenuto un aggiornamento, ma probabilmente ha più senso confrontare effettivamente le modifiche e agire di conseguenza.In questo modo, l'istruzione di aggiornamento delle 14:00 del collega verrebbe comunque eseguita, ma LastUpdate mostrerebbe comunque le 8:00.

--Kevin

Sono d'accordo con l'idea del trigger, anche se utilizzerei un join da inserire invece di una sottoquery.Tuttavia, voglio sottolineare che il nome utente è una scelta particolarmente sbagliata per una chiave primaria.I nomi utente cambiano spesso e quando succede è necessario modificare tutte le tabelle correlate.È molto meglio avere un ID utente come chiave e quindi inserire un indice univoco nel nome utente.Quindi quando il nome utente cambia, non è necessario modificare nient'altro.

Dovrai utilizzare i trigger per questo.

Il mio suggerimento sarebbe quello di creare una procedura memorizzata che imposta lastUpdate su getdate() per impostazione predefinita.

Ho cercato di evitare i trigger in passato perché prima di SQL2005 individuarli e modificarli era una seccatura.Soprattutto per gli sviluppatori che sono nuovi al tuo progetto.

Aggiungilo anche come valore predefinito per la definizione della colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top