tablas - trigger bitacora sql server 2008
¿Cómo rastrear los cambios en los registros en SQL Server? (3)
Esto se puede hacer creando después de insertar / activar la activación en las tablas que necesita rastrear. Usando las tablas lógicas Inserted / Deleted in sql server, puede rastrear los campos recién insertados y modificados en una tabla.
Insertado (tabla lógica): le dará los detalles de los registros recientemente insertados / valores actualizados (valores de columna).
Borrado (Tabla lógica): le dará el valor anterior de un campo antes de que se modifique / elimine.
Tengo la siguiente tabla que tiene registros de seguimiento de todos los estudiantes.
|==========================================|
| ID | Department | Date |
|==========================================|
| 001 | English | Feb 3 2017 |
| 001 | English | Feb 4 2017 |
| 001 | Science | Mar 1 2017 |
| 001 | Science | Apr 2 2017 |
| 001 | Maths | Apr 7 2017 |
| 002 | Maths | Feb 1 2017 |
| 002 | Maths | Apr 7 2017 |
| 003 | Maths | Apr 3 2017 |
| 004 | Science | Feb 1 2017 |
| 004 | Maths | Apr 7 2017 |
|==========================================|
Necesito recuperar el registro anterior justo antes de que el alumno haya cambiado el departamento. Para el ejemplo anterior, el conjunto de registros devuelto debe
Para 001,
| 001 | English | Feb 4 2017 |
| 001 | Science | Apr 2 2017 |
Para 002 y 003
Sin cambios
Para 004
| 004 | Science | Feb 1 2017 |
También existe la posibilidad de que el mismo usuario pueda volver al mismo departamento. por ejemplo, user001 puede cambiar del departamento a al departamento b al departamento c y al departamento a. He leído sobre T-SQL enviar y recibir. Pero no estoy seguro si eso ayudaría en este escenario. Por favor ayuda.
No estoy tan seguro, pero puede obtener ayuda con el concepto de procedimientos almacenados. Son funciones que forman parte de la base de datos. Puede configurar la pantalla cuando realiza la consulta
Una forma de hacerlo es usar la función ROW_NUMBER
con partición para detectar cuándo cambia el valor de la columna Department
.
Data de muestra
DECLARE @T TABLE (ID int, Department nvarchar(100), dt date);
INSERT INTO @T (ID, Department, dt) VALUES
(1, ''English'', ''Feb 3 2017''),
(1, ''English'', ''Feb 4 2017''),
(1, ''Science'', ''Mar 1 2017''),
(1, ''Science'', ''Apr 2 2017''),
(1, ''Maths '', ''Apr 7 2017''),
(2, ''Maths '', ''Feb 1 2017''),
(2, ''Maths '', ''Apr 7 2017''),
(3, ''Maths '', ''Apr 3 2017''),
(4, ''Science'', ''Feb 1 2017''),
(4, ''Maths '', ''Apr 7 2017'');
Consulta
WITH
CTE
AS
(
SELECT
ID
,Department
,dt
,ROW_NUMBER() OVER (PARTITION BY ID, Department ORDER BY dt DESC) AS rnPart
,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY dt DESC) AS rnID
FROM @T
)
SELECT
ID
,Department
,dt
FROM CTE
WHERE
rnPart = 1
AND rnID <> 1
ORDER BY
ID
,dt
;
Resultado
+----+------------+------------+
| ID | Department | dt |
+----+------------+------------+
| 1 | English | 2017-02-04 |
| 1 | Science | 2017-04-02 |
| 4 | Science | 2017-02-01 |
+----+------------+------------+