No vamos a entrar en si es trabajo del administrador, del log… esto es fácil y rápido
- Nos creamos una tabla que tiene la misma estructura que la tabla que queremos auditar backup_movimientos_mitabla , añadiendo 3 campos
Fecha --> de tipo date
Movimiento -->de tipo char(1) --> para saber si es un (Insert, Update o Delete)
Secuencia--> como campo identity y además primary key
- De la tabla que queremos audtiar, añadimos el siguiente trigger
CREATE TRIGGER [dbo].[tr_mitabla]
ON [dbo].[mitabla]
AFTER INSERT,DELETE, UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Type as char(1)
-- Identificar que evento se está ejecutando (Insert, Update o Delete)
if exists (SELECT * FROM inserted)
if exists (SELECT * FROM deleted)
SELECT @Type='U' -- Si es un update
else
SELECT @Type='I' -- Si es un insert
else
SELECT @Type='D' -- si es un delete
-- Ahora guadarmos el cambios segun sea un tipo u otro
if @Type ='D' or @Type ='U'
insert into backup_movimientos_mitabla select *, getdate(), @Type FROM deleted
else
insert into backup_movimientos_mitabla select *, getdate(), @Type FROM inserted
set NoCount OFF;
END
Y ya está , lo probamos
insert into mitabla (column1, column2) values ('9999','Prueba backup');
update mitabla set column2='Prueba backup 0 ' where column1 ='9999';
delete from mitabla where column1 ='9999';
select * from backup_movimientos_mitabla
Como veras cuando hay un update, guardo el valor que había en la tabla, si quisieras guardar tanto el valor anterior como el nuevo tendrías que usar Deleted & Inserted, cuando es de tipo ‘U’
Claro que hay otra formas:
Trigger genérico
Change Data Capture (CDC) y Change Tracking (CT).