Crear historia de cambios en una tabla

Quisiera tener la historia de los cambios hechos sobre una tabla t1
donde solo pueden variar 2 campos (c1 y c2) por ejemplo:
Create table t1 (idt int IDENTITY(1,1) PRIMARY KEY, nt varchar(50), c1
int, c2 int)
Lo primero que se me ocurre es crear otra tabla t1s con la siguiente estructura:
create table t1s (idt int, c1 int, c2 int, fecha smalldatetime
default getdate())
y en la tabla t1 programarle un trigger
CREATE TRIGGER cambia ON [dbo].[t1]
FOR update
AS
if update(c1) or update(c2)
insert into t1s
select idt,c1,c2 from deleted
Ahora si quisiera saber el estado de la tabla t1 hasta la actualidad basta
select * from t1
Pero si quisiera saber el estado hace una semana ¿cómo sería?
¿O alguien tiene una mejor idea?
¿En este caso se me ocurre si hago más de un cambio en un articulo el
mismo día no se como resolverlo pues entonces me aparecerían en t1s
los dos el mismo día y en el caso de que borre el artículo que hacer
crear otra tabla para los artículos borrados?
En fin agradecería cualquier ayuda
Santiago
Trabajo SQL Server 2000
Respuesta
1
Lo que aquí tienes es un trigger que genera una tabla de histórico. El objeto es que cuando un Empleado cambie de adscripción, se registre un movimiento con la salida de la adscripción anterior y la nueva situación. El histórico guarda para cada empleado la fecha de entrada y la fecha de salida en una sección. Si el empleado está todavía en la sección en el histórico hay un null en la fecha de salida. Podríamos hacer que el trigger no grabase el registro último para no tener que actualizarlo después, pero a mi me parece más elegante esta solución.
Si en un futuro queremos saber los movimientos que ha tenido un empleado, podemos en nuestra select cambiar los nulos por la fecha actual, de tal forma que tendríamos un listado que diría que el empleado 3 está en la sección 1 desde una fecha hasta hoy. Para eso podríamos poner en la select un isnull(Campo, getdate()) y resuelto.
El Código
if not objectproperty(object_id('EmpleadoAdscripcion'),'IsTable') is null
drop table empleadoadscripcion
go
create table empleadoAdscripcion (idEmpleado int not null ,idAdscripcion int not null,fecha datetime)
Go
Alter table empleadoAdscripcion add constraint pk_ead primary key (idEmpleado)
Go
if not objectproperty(object_id('histempads'),'IsTable') is null
drop table histempads
go
create table histempads (idEmpleado int, idAdscripcion int, FechaInicial datetime, FechaFinal datetime)
Go
Create index ind_hitem on histempads (idEmpleado, idAdscripcion)
Go
create trigger trg_eads on empleadoadscripcion for insert, update
as
begin
-- Primero actualizo la fecha de salida del registro anterior ...
update HistEmpAds Set HistEmpAds.fechaFinal=i.Fecha
from Inserted i inner join Deleted d on i.idEmpleado=d.idEmpleado
where HistEmpAds.idEmpleado= i.IdEmpleado and HistEmpAds.idAdscripcion = d.idAdscripcion
-- Ahora insertamos el movimiento
insert HistEmpAds
select idEmpleado,idAdscripcion,Fecha,null from inserted
end
go
insert into empleadoAdscripcion values (1,1,'20010101')
go
update empleadoAdscripcion set idAdscripcion=2,fecha='20010110' where idempleado=1
go
insert into empleadoAdscripcion values (2,2,'20010101')
go
update empleadoAdscripcion set fecha=getdate(),idadscripcion=3
go
select * From histempads
Hola marcelocf:
Creo entender la lógica de tu respuesta, ¿ahora cómo sería el select para saber el estado en una fecha determinada?
La verdad que no había pensado en esta variante
select * from t1s where fecha between @FchIni and @FchFin
Te felicito !

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas