Columna de fecha y hora de actualización automática de SQL Server 2005: última actualización

StackOverflow https://stackoverflow.com/questions/36001

Pregunta

Tengo una tabla definida (consulte el fragmento de código a continuación).¿Cómo puedo agregar una restricción o lo que sea para que la columna LastUpdate se actualice automáticamente cada vez que se cambia la fila?

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  
)
¿Fue útil?

Solución

Una restricción predeterminada sólo funciona en inserciones;para una actualización utilice un disparador.

Otros consejos

Estoy de acuerdo con los demás: establezca un valor predeterminado de GetDate() en la columna LastUpdate y luego use un disparador para manejar cualquier actualización.

Algo simple como esto:

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

Si quiere ser realmente sofisticado, haga que evalúe lo que se está cambiando versus lo que hay en la base de datos y solo modifique LastUpdate si hubo una diferencia.

Considera esto...

  • 7 am - El usuario 'jsmith' se crea con el apellido 'Smithe' (ups), LastUpdate tiene como valor predeterminado las 7 a.m.

  • 8 am - 'jsmith' envía un correo electrónico a TI para decir que su nombre es incorrecto.Inmediatamente realiza la actualización, por lo que el apellido ahora es 'Smith' y (gracias al activador) LastUpdate muestra las 8 a.m.

  • 2pm - Tu compañero de trabajo más vago finalmente se aburre de StumbleUpon y revisa su correo electrónico.Ve el mensaje anterior de 'jsmith' sobre el cambio de nombre.El corre: ACTUALIZAR perfiles SET Apellido='Smith' WHERE Nombre de usuario='jsmith' Y luego vuelve a surfear en Myspace.Sin embargo, al activador no le importa que el apellido ya fuera 'Smith', por lo que LastUpdate ahora muestra las 2:00 p.m.

Si simplemente cambia a ciegas LastUpdate cada vez que se ejecuta una declaración de actualización, es TÉCNICAMENTE correcto porque ocurrió una actualización, pero probablemente tenga más sentido comparar los cambios y actuar en consecuencia.De esa manera, la declaración de actualización de las 2:00 p. m. del compañero de trabajo aún se ejecutaría, pero la última actualización aún mostraría las 8:00 a. m.

--Kevin

Estoy de acuerdo con la idea del desencadenador, aunque usaría una combinación para insertar en lugar de una subconsulta.Sin embargo, quiero señalar que el nombre de usuario es una elección particularmente mala para una clave principal.Los nombres de usuario cambian a menudo y, cuando lo hacen, es necesario cambiar todas las tablas relacionadas.Es mucho mejor tener una identificación de usuario como clave y luego colocar un índice único en el nombre de usuario.Luego, cuando cambie el nombre de usuario, no necesitará cambiar nada más.

Vas a tener que usar disparadores para eso.

Mi sugerencia sería crear un procedimiento almacenado que establezca de forma predeterminada la última actualización en getdate().

He tratado de evitar los desencadenantes en el pasado porque antes de SQL2005 localizarlos y editarlos era un dolor de cabeza.Especialmente para desarrolladores que son nuevos en su proyecto.

También agréguelo como valor predeterminado para la definición de su columna.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top