mes - Columna actualizada de DateTime automática de SQL Server 2005-LastUpdated
sysdate en sql server (5)
Tengo una tabla definida (ver 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 cambie 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
)
Estoy de acuerdo con los demás: establezca un valor predeterminado de GetDate () en la columna LastUpdate y luego use un disparador para manejar las actualizaciones.
Solo 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 quieres ser realmente elegante, haz que evalúe lo que se está modificando en comparación con lo que está en la base de datos y solo modifica LastUpdate si hubo alguna diferencia.
Considera esto...
7 a . M. - El usuario ''jsmith'' se crea con el apellido ''Smithe'' (oops), LastUpdate está predeterminado a las 7 a.m.
8 a.m. - ''jsmith'' envía un correo electrónico informándole que su nombre es incorrecto. Inmediatamente lleva a cabo la actualización, por lo que ahora el apellido es ''Smith'' y (gracias al activador) LastUpdate muestra las 8 a.m.
2pm - Su compañero de trabajo más flojo finalmente se aburre con StumbleUpon y revisa su correo electrónico. Él ve el mensaje anterior de ''jsmith'' con respecto al cambio de nombre. Se ejecuta: UPDATE Perfiles SET LastName = ''Smith'' WHERE Nombre de usuario = ''jsmith'' y luego vuelve a navegar por MySpace. Sin embargo, al activador no le importa que el apellido ya fuera ''Smith'', entonces LastUpdate ahora muestra 2pm.
Si solo modifica ciegamente LastUpdate cada vez que se ejecuta una instrucción de actualización, es TÉCNICAMENTE correcta porque se realizó una actualización, pero probablemente tenga más sentido comparar los cambios y actuar en consecuencia. De esta forma, la declaración de Actualización a las 2 p.m. del compañero de trabajo se seguiría ejecutando, pero LastUpdate aún mostraría las 8 a.m.
- Kevin
Mi sugerencia sería crear un procedimiento almacenado que establezca de forma predeterminada lastUpdate to getdate ().
Intenté evitar los disparadores en el pasado porque antes de SQL2005 localizarlos y editarlos era un problema en el trasero. Especialmente para desarrolladores que son nuevos en su proyecto.
También agregue eso como el valor predeterminado para la definición de su columna.
Tendrás que usar disparadores para eso.
una restricción de falla solo funciona en inserciones, para una actualización usa un disparador
Estoy de acuerdo con la idea de desencadenar, aunque utilizaría una combinación para insertar en lugar de una subconsulta. Sin embargo, quiero señalar que el nombre de usuario es una opción particularmente pobre para una clave principal. Los nombres de usuario a menudo cambian y cuando lo hacen, necesita cambiar todas las tablas relacionadas. Es mucho mejor tener una identificación de usuario como clave y luego poner un índice único en el nombre de usuario. Luego, cuando el nombre de usuario cambie, no necesita cambiar nada más.