Ciao,
prova a basarti su una soluzione di questo tipo
Crei una tabella di LOG
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[LogTabelle](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Tabella] [varchar](200) NOT NULL,
[Operatore] [varchar](100) NULL,
[TipoOperazione] [varchar](10) NULL,
[Record] [xml] NULL,
[Data] [datetime] NULL DEFAULT (getdate()),
[IdTabella] [int] NULL,
CONSTRAINT [PK_LogAggiornamentiTabelle] PRIMARY KEY NONCLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
E poi aggiungi un trigger alla tabella da tracciare come questo
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Insert_Update_Delete_<nometabella>]
ON [dbo].[<nometabella>]
AFTER INSERT,UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
begin try
insert into dbo.LogTabelle(Tabella,Operatore,TipoOperazione,Record, IdTabella)
SELECT '<nometabella>', SUSER_NAME(), CASE WHEN DEL.Id IS NULL THEN 'INSERT' ELSE 'UPDATE' END, XMLDOC, TAB.Id
from dbo.<nometabella> TAB
inner join inserted INS ON INS.Id = TAB.Id
outer apply (select * from deleted DEL2 WHERE DEL2.Id = TAB.ID) DEL
cross apply (select *
from dbo.<nometabella> TAB2
where TAB2.Id = TAB.Id
FOR XML RAW ('<nometabella>'), ELEMENTS, TYPE) AS RECXML(XMLDOC)
insert into dbo.LogTabelle(Tabella,Operatore,TipoOperazione,Record, IdTabella)
SELECT '<nometabella>', SUSER_NAME(), 'DELETE', XMLDOC, DEL.Id
from deleted DEL
cross apply (select *
from deleted TAB2
where TAB2.Id = DEL.Id
FOR XML RAW ('<nometabella>'), ELEMENTS, TYPE) AS RECXML(XMLDOC)
end try
begin catch
-- gestione errore
end catch
END
Con questa soluzione hai una tabella che contiene la traccia di tutte le modifiche effettuate ai record di qualsiasi tabella che tu voglia tenere sotto traccia
Ciao
Luca