sql >> Base de Datos >  >> RDS >> Sqlserver

Cree una columna de "Última modificación" en SQL Server

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.