Algunas tablas de la base de datos incluyen una columna de "última modificación", que almacena la fecha y la hora en que se actualizó la fila por última vez. Cada vez que se actualiza la fila, la fecha se actualiza para reflejar la fecha y la hora de esa actualización.
En SQL Server, puede usar un activador para realizar esta actualización.
Un disparador es un tipo especial de procedimiento almacenado que se ejecuta automáticamente cuando ocurre un evento en el servidor de la base de datos.
Puedes usar el CREATE TRIGGER
declaración para crear un activador al usar T-SQL. Esta instrucción se puede utilizar para crear un activador de inicio de sesión, DML o DML.
Ejemplo
El siguiente código crea una tabla, así como un disparador que actualiza la ModifiedDate
columna cada vez que hay una actualización.
CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);
Insertar una fila
Insertemos una fila y selecciónela para ver el resultado de DEFAULT
restricción:
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Resultado (usando salida vertical):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Esto se muestra utilizando la salida vertical para que sea más fácil de leer (para que no tenga que desplazarse hacia los lados para leer todas las columnas).
En este caso, tanto la CreatedDate
y ModifiedDate
las columnas contienen el mismo valor. Sin embargo, si la fila se actualiza, la ModifiedDate
El valor de debe cambiar. Por eso creamos el disparador.
Actualizar la Fila
Ahora actualicemos la fila y seleccionemos los resultados.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Resultado (usando salida vertical):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Como era de esperar, la ModifiedDate
la columna se actualiza pero el CreateDate
columna permanece igual.
Explicación adicional del Código
A continuación se muestra una explicación más detallada del código utilizado para crear la tabla y su activador asociado.
La Mesa
El siguiente código crea la tabla:
CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);
La ModifiedDate
la columna tiene un DEFAULT
restricción que establece el valor predeterminado en CURRENT_TIMESTAMP
(al igual que el CreateDate
columna).
Esto significa que cuando la fila se inserta por primera vez, el CURRENT_TIMESTAMP
se inserta en esas columnas.
Esto está bien para la inserción inicial, pero no tiene en cuenta las actualizaciones posteriores. Ahí es donde entra el gatillo.
El gatillo
El siguiente código crea el disparador:
CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);
En este caso, llamé al disparador trg_Books_UpdateModifiedDate
.
Lo creé en dbo.Books
base de datos, y se ejecuta después de cada UPDATE
.
Cuando se ejecuta, actualiza la ModifiedDate
columna a CURRENT_TIMESTAMP
(pero solo en la fila que se actualizó, por supuesto).
Puedo determinar qué fila se actualizó comprobando inserted
mesa. El inserted
table es una tabla temporal residente en memoria que SQL Server crea y mantiene.
El inserted
la tabla almacena copias de las filas afectadas durante INSERT
y UPDATE
declaraciones. Durante una transacción de inserción o actualización, se agregan nuevas filas tanto al inserted
la tabla y la tabla de activación. Las filas en el inserted
son copias de las nuevas filas en la tabla de activación.
Además del inserted
tabla, SQL Server también crea y mantiene un deleted
mesa. Una transacción de actualización es similar a una operación de eliminación seguida de una operación de inserción; las filas antiguas se copian en el deleted
tabla primero, y luego las nuevas filas se copian en la tabla de activación y en el inserted
mesa.
Un activador para la columna "Fecha de creación"
Usando un DEFAULT
La restricción es una forma práctica de crear el valor inicial, pero corre el riesgo de que alguien pueda actualizar directamente ese valor más adelante.
Si ve esto como un problema, puede modificar el activador para incluir la columna "Fecha de creación", de modo que se restablezca a su valor original cada vez que haya una actualización en la fila.
Puede obtener el valor original del deleted
tabla, ya que las filas antiguas se copian primero en esta tabla, antes de que se realicen actualizaciones.